Ні, не можна перевантажувати лямбда!
Лямбди - це анонімні функтори (тобто об'єкти без назви функцій), а не прості функції. Тому перевантажувати ці об’єкти неможливо. Те, що ви в основному намагаєтеся зробити, - це майже
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
можливість інстанціювати єдину гілку, істинну під час компіляції.
Можливі рішення:
- Єдиний шаблон змінної лямбда. або
- Узагальнена лямбда і знайдіть тип параметра, використовуючи
decltype
для if constexpr
перевірки. (Кредити @NathanOliver )
Використовуючи шаблон varijabe, ви можете зробити щось на кшталт. ( Дивіться демо-версію в режимі онлайн )
#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
- це лише локальні змінні, які не можуть повторно використовувати те саме ім’я.