Không, bạn không thể quá tải lambda!
Lambdas là functor nặc danh (tức là các đối tượng hàm không tên) và không phải là các hàm đơn giản. Do đó, quá tải những đối tượng không thể. Những gì bạn về cơ bản cố gắng làm là gần như
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
Điều này là không thể, vì cùng một tên biến không thể được sử dụng lại trong C ++.
Tuy nhiên, trong c ++ 17, chúng ta có if constexpr
thể khởi tạo nhánh duy nhất đúng với thời gian biên dịch.
Ý nghĩa của các giải pháp có thể là:
- Một mẫu lambda duy nhất . hoặc là
- Một lambda chung và tìm loại tham số sử dụng
decltype
cho if constexpr
kiểm tra. (Tín dụng @NathanOliver )
Sử dụng mẫu matrixbe bạn có thể làm một cái gì đó như. ( Xem bản demo trực tuyến )
#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];
}
};
và gọi nó như
int r = translate<int>(line[0]);
int c = translate<char>(line[1]);
Sử dụng lambda chung (kể từ c ++ 14 ), ở trên sẽ là: ( Xem bản demo trực tuyến )
#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];
}
};
và gọi lambda như bạn làm bây giờ:
int r = translate(static_cast<int>(line[0]));
int c = translate(static_cast<char>(line[1]));
translate
chỉ là các biến cục bộ không thể sử dụng lại cùng tên.