না, আপনি ল্যাম্বডাকে ওভারলোড করতে পারবেন না!
ল্যাম্বডাস বেনামে ফান্টেক্টর (অর্থাত্ নামবিহীন ফাংশন অবজেক্টস), এবং সাধারণ ফাংশন নয়। অতএব, objects অবজেক্টগুলি ওভারলোড করা সম্ভব নয়। আপনি মূলত যা করার চেষ্টা করছেন তা প্রায়
struct <some_name>
{
int operator()(int idx) const
{
return {}; // some int
}
}translate; // >>> variable name
struct <some_name>
{
int operator()(char idx) const
{
return {}; // some int
}
}translate; // >>> variable name
যা সম্ভব নয়, কারণ একই পরিবর্তনশীল নামটি C ++ এ পুনরায় ব্যবহার করা যায় না।
যাইহোক, সি ++ 17 এ আমাদের রয়েছে if constexpr
যার দ্বারা কেউ একমাত্র শাখাটি ইনস্ট্যান্ট করতে পারে যা সংকলনের সময় সত্য।
সম্ভাব্য সমাধানগুলি হ'ল অর্থ:
- একটি একক ভেরিয়েব টেম্পলেট লাম্বদা । অথবা
- একটি জেনেরিক ল্যাম্বদা এবং চেকটির
decltype
জন্য প্যারামিটারের ধরণটি খুঁজে বার করুন credif constexpr
(ক্রেডিটগুলি @ নাথানঅলিভার )
ভেরাবেব টেম্পলেট ব্যবহার করে আপনি এর মতো কিছু করতে পারেন। ( অনলাইন লাইভ ডেমো দেখুন )
#include <type_traits> // std::is_same_v
template<typename T>
constexpr auto translate = [](T idx)
{
if constexpr (std::is_same_v<T, int>)
{
constexpr static int table[8]{ 7,6,5,4,3,2,1,0 };
return table[idx];
}
else if constexpr (std::is_same_v<T, char>)
{
std::map<char, int> table{ {'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', 4}, {'f', 5}, {'g', 6}, {'h', 7} };
return table[idx];
}
};
এবং এটি পছন্দ করুন
int r = translate<int>(line[0]);
int c = translate<char>(line[1]);
জেনেরিক ল্যাম্বদা ব্যবহার করে (যেহেতু সি ++ ১৪ ), উপরেরগুলি হবে: ( অনলাইনে একটি লাইভ ডেমো দেখুন )
#include <type_traits> // std::is_same_v
constexpr auto translate = [](auto idx)
{
if constexpr (std::is_same_v<decltype(idx), int>)
{
constexpr static int table[8]{ 7,6,5,4,3,2,1,0 };
return table[idx];
}
else if constexpr (std::is_same_v<decltype(idx), char>)
{
std::map<char, int> table{ {'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', 4}, {'f', 5}, {'g', 6}, {'h', 7} };
return table[idx];
}
};
এবং এখন যেমন করে ল্যাম্বডাকে কল করুন:
int r = translate(static_cast<int>(line[0]));
int c = translate(static_cast<char>(line[1]));
translate
কেবল স্থানীয় ভেরিয়েবল যা একই নামটি পুনরায় ব্যবহার করতে পারে না।