Нет нельзя лямбду перегружать!
Лямбды - это анонимные функторы (т. Е. Объекты без имен), а не простые функции. Поэтому перегрузка этих объектов невозможна. То, что вы в основном пытаетесь сделать, это почти
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
возможность создавать единственную ветвь, которая является истинной во время компиляции.
Имеются в виду возможные решения:
- Один шаблон variabe лямбда. или
- Общая лямбда и найти тип параметра, используемого
decltype
для if constexpr
проверки. ( Credits @NathanOliver )
Используя шаблон variabe вы можете сделать что-то вроде. ( Смотрите живую демоверсию онлайн )
#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]);
Используя общую лямбду (начиная с c ++ 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
это просто локальные переменные, которые не могут использовать одно и то же имя.