Nie, nie możesz przeciążać lambda!
Lambdas to anonimowe funktory (tj. Nienazwane obiekty funkcyjne), a nie proste funkcje. Dlatego przeciążenie tych obiektów nie jest możliwe. W zasadzie próbujesz to zrobić
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
Nie jest to możliwe, ponieważ tej samej nazwy zmiennej nie można ponownie użyć w C ++.
Jednak w c ++ 17 mamy if constexpr
instancję jedynej gałęzi, która jest prawdziwa w czasie kompilacji.
Znaczenie możliwych rozwiązań to:
- Pojedynczy szablon vardabe lambda. lub
- Ogólna lambda i znajdź typ parametru używanego
decltype
do if constexpr
kontroli. (Kredyty @NathanOliver )
Za pomocą szablonu variabe możesz zrobić coś takiego. ( Zobacz prezentację online na żywo )
#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];
}
};
i nazwać to tak
int r = translate<int>(line[0]);
int c = translate<char>(line[1]);
Używając ogólnej lambda (od c ++ 14 ), powyższe będzie: ( Zobacz demo na żywo online )
#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];
}
};
i zawołaj lambda tak jak teraz:
int r = translate(static_cast<int>(line[0]));
int c = translate(static_cast<char>(line[1]));
translate
są tylko lokalnymi zmiennymi, które nie mogą ponownie użyć tej samej nazwy.