Não, você não pode sobrecarregar o lambda!
Os lambdas são functores anônimos (ou seja, objetos de função sem nome), e não funções simples. Portanto, sobrecarregar esses objetos não é possível. O que você basicamente está tentando fazer é quase
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
O que não é possível, pois o mesmo nome de variável não pode ser reutilizado no C ++.
No entanto, em c ++ 17 , temos if constexpr
como instanciar o único ramo que é verdadeiro no tempo de compilação.
Significando que as soluções possíveis são:
- Um único modelo variabe lambda. ou
- Um lambda genérico e encontre o tipo do parâmetro usado
decltype
para a if constexpr
verificação. ( Credits @NathanOliver )
Usando o modelo variabe, você pode fazer algo parecido. ( Veja uma demonstração ao vivo 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];
}
};
e chame assim
int r = translate<int>(line[0]);
int c = translate<char>(line[1]);
Usando lambda genérico (desde c ++ 14 ), o acima será: ( Veja uma demonstração ao vivo on-line )
#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];
}
};
e chame o lambda como você faz agora:
int r = translate(static_cast<int>(line[0]));
int c = translate(static_cast<char>(line[1]));
translate
são apenas variáveis locais que não podem reutilizar o mesmo nome.