এটি আমার কাছে অবাক করার মতো অনেকগুলি উত্তর রয়েছে, তবে প্রায় সকলেই ভারী টেম্পলেট যাদুতে নির্ভর করে। টেমপ্লেটগুলি শক্তিশালী, তবে কখনও কখনও ম্যাক্রোগুলি সংক্ষিপ্ততায় তাদের পরাজিত করে। উভয়কে একত্রিত করে সর্বোচ্চ বহুমুখিতা প্রায়শই অর্জন করা হয়।
আমি একটি ম্যাক্রো লিখেছিলাম FROM_CONST_OVERLOAD()
যা কনস্ট্যান্ট ফাংশনটি শুরু করতে নন-কনস্ট্যান্ট ফাংশনে রাখা যেতে পারে।
ব্যবহারের উদাহরণ:
class MyClass
{
private:
std::vector<std::string> data = {"str", "x"};
public:
// Works for references
const std::string& GetRef(std::size_t index) const
{
return data[index];
}
std::string& GetRef(std::size_t index)
{
return FROM_CONST_OVERLOAD( GetRef(index) );
}
// Works for pointers
const std::string* GetPtr(std::size_t index) const
{
return &data[index];
}
std::string* GetPtr(std::size_t index)
{
return FROM_CONST_OVERLOAD( GetPtr(index) );
}
};
সহজ এবং পুনরায় ব্যবহারযোগ্য প্রয়োগ:
template <typename T>
T& WithoutConst(const T& ref)
{
return const_cast<T&>(ref);
}
template <typename T>
T* WithoutConst(const T* ptr)
{
return const_cast<T*>(ptr);
}
template <typename T>
const T* WithConst(T* ptr)
{
return ptr;
}
#define FROM_CONST_OVERLOAD(FunctionCall) \
WithoutConst(WithConst(this)->FunctionCall)
ব্যাখ্যা:
অনেক উত্তরে পোস্ট হিসাবে, একটি অ-সদস্য সদস্য ফাংশনে কোড নকল এড়ানোর জন্য সাধারণ প্যাটার্নটি হ'ল:
return const_cast<Result&>( static_cast<const MyClass*>(this)->Method(args) );
টাইপ ইনফারেন্স ব্যবহার করে এই প্রচুর বয়লারপ্লেট এড়ানো যায়। প্রথমত, const_cast
এ encapsulated করা যেতে পারে WithoutConst()
, যা তার যুক্তি ধরণ infers এবং const-কোয়ালিফায়ার সরিয়ে ফেলা হয়। দ্বিতীয়ত, অনুরূপ পয়েন্টারটি পয়েন্টারটির WithConst()
যোগ্যতা অর্জনের জন্য ব্যবহার করা যেতে পারে this
, যা কনস্ট-ওভারলোডেড পদ্ধতিটিকে কল করতে সক্ষম করে।
বাকিটি হ'ল একটি সরল ম্যাক্রো যা সঠিকভাবে যোগ্যতার সাথে কলটির উপসর্গ করে this->
এবং ফলাফলটি থেকে কনটকে সরিয়ে দেয়। যেহেতু ম্যাক্রোতে ব্যবহৃত অভিব্যক্তিটি প্রায় সর্বদা 1: 1 ফরোয়ার্ড আর্গুমেন্ট সহ একটি সাধারণ ফাংশন কল তাই একাধিক মূল্যায়নের মতো ম্যাক্রোগুলির ঘাটতি কিক করে না The__VA_ARGS__
এছাড়াও ব্যবহার করা যেতে পারে, কিন্তু কমা (হিসাবে প্রয়োজন করা উচিত নয় আর্গুমেন্ট বিভাজক) প্রথম বন্ধনী মধ্যে ঘটে।
এই পদ্ধতির বিভিন্ন সুবিধা রয়েছে:
- সর্বনিম্ন এবং প্রাকৃতিক বাক্য গঠন - কেবল কলটি মোড়ানো
FROM_CONST_OVERLOAD( )
- কোনও অতিরিক্ত সদস্যের প্রয়োজন নেই
- সি ++ 98 এর সাথে সামঞ্জস্যপূর্ণ
- সরল বাস্তবায়ন, কোনও টেম্পলেট বিপণন এবং শূন্য নির্ভরতা নেই
- এক্সটেনসেবল: অন্যান্য const সম্পর্ক যোগ করা যেতে পারে (যেমন
const_iterator
, std::shared_ptr<const T>
, ইত্যাদি)। এটির WithoutConst()
জন্য, সম্পর্কিত ধরণের জন্য কেবল ওভারলোড ।
সীমাবদ্ধতা: এই সমাধানটি দৃশ্যের জন্য অনুকূলিত হয়েছে যেখানে কনস্ট্যান্ট ওভারলোডের মতো কনস্ট্যান্ট ওভারলোড ঠিক একই কাজ করছে, যাতে যুক্তিগুলি 1: 1 এগিয়ে যেতে পারে। যদি আপনার যুক্তিটি পৃথক হয় এবং আপনি কনস্টের সংস্করণটির মাধ্যমে কল করছেন না this->Method(args)
, আপনি অন্যান্য পদ্ধতির বিষয়ে বিবেচনা করতে পারেন।