ไม่คุณไม่สามารถบรรทุกแลมบ์ดาได้!
lambdas เป็นหน้าที่ไม่ระบุชื่อ (เช่นฟังก์ชันวัตถุที่ไม่มีชื่อ) และไม่ใช่ฟังก์ชั่นทั่วไป ดังนั้นการโอเวอร์โหลดวัตถุเหล่านั้นจึงเป็นไปไม่ได้ สิ่งที่คุณพยายามจะทำก็คือเกือบ
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 )
การใช้เทมเพลต 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
เป็นตัวแปรเฉพาะที่ไม่สามารถใช้ชื่อเดียวกันซ้ำได้