Nein, Sie können das Lambda nicht überladen!
Die Lambdas sind anonyme Funktoren (dh unbenannte Funktionsobjekte) und keine einfachen Funktionen. Daher ist eine Überladung dieser Objekte nicht möglich. Was Sie im Grunde versuchen, ist fast
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
Dies ist nicht möglich, da derselbe Variablenname in C ++ nicht wiederverwendet werden kann.
In c ++ 17 haben wir jedochif constexpr
die Möglichkeit, den einzigen Zweig zu instanziieren, der zur Kompilierungszeit wahr ist.
Die möglichen Lösungen sind:
- Eine einzelne variable Vorlage Lambda. oder
- Ein generisches Lambda und finden Sie den Typ des Parameters, der
decltype
für die if constexpr
Prüfung verwendet wird. (Credits @NathanOliver )
Mit variabe template können Sie so etwas tun. ( Sehen Sie eine Live-Demo online )
#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];
}
};
und nenne es wie
int r = translate<int>(line[0]);
int c = translate<char>(line[1]);
Bei Verwendung von generischem Lambda (seit c ++ 14 ) gilt Folgendes: ( Sehen Sie sich eine Live-Demo online an. )
#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];
}
};
und nenne das Lambda wie jetzt:
int r = translate(static_cast<int>(line[0]));
int c = translate(static_cast<char>(line[1]));
translate
sind nur lokale Variablen, die denselben Namen nicht wiederverwenden können.