नहीं, आप लंबोदर को अधिभार नहीं दे सकते!
लैम्ब्डा गुमनाम फंक्शंस (यानी अनाम फ़ंक्शन ऑब्जेक्ट्स) हैं, और सरल फ़ंक्शन नहीं हैं। इसलिए, उन वस्तुओं को ओवरलोड करना संभव नहीं है। आप मूल रूप से जो करने की कोशिश कर रहे हैं वह लगभग है
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 ++ में समान चर नाम का पुन: उपयोग नहीं किया जा सकता है।
हालाँकि, c ++ 17 में हमारे पास if constexpr
एक ही शाखा है, जो संकलन के समय सही है
मतलब संभव समाधान हैं:
- एक एकल varabe टेम्पलेट लैम्ब्डा। या
- एक सामान्य लैम्ब्डा और चेक के
decltype
लिए उपयोग किए जाने वाले पैरामीटर के प्रकार का पता लगाएं if constexpr
। (क्रेडिट @NathanOliver )
Varabe टेम्पलेट का उपयोग करके आप कुछ ऐसा कर सकते हैं। ( ऑनलाइन एक लाइव डेमो देखें )
#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]);
जेनेरिक लैम्ब्डा ( सी ++ 14 के बाद से ) का उपयोग करना , उपरोक्त होगा: ( ऑनलाइन एक लाइव डेमो देखें )
#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
केवल स्थानीय चर हैं जो समान नाम का पुन: उपयोग नहीं कर सकते हैं।