如果我有一个 lambda 函数
auto foo = [](auto && a, auto && b){ /* some random c++ code */ };
Run Code Online (Sandbox Code Playgroud)
即使该类型可以是任何类型,我如何声明a和b应该是相同的类型?
您可以static_assert在 lambda 主体中添加一个:
#include <type_traits>
auto foo = [](auto && a, auto && b){
static_assert(std::is_same<typename std::remove_reference<decltype(a)>::type,
typename std::remove_reference<decltype(b)>::type>::value,
"Must be of the same type!");
};
Run Code Online (Sandbox Code Playgroud)
您可能想要调整实例化的类型std::is_same,例如在比较时不考虑const- 或volatile限定符等(想想std::decay)。但请注意,可能存在如下问题:
foo("abc", "de"); // fails to compile
Run Code Online (Sandbox Code Playgroud)
因为这里的推导类型是字符数组,而不是const char*.
我知道它标有 C++14,但这里有一个 C++20 解决方案,以防万一:
auto foo = []<typename T>(T && a, T && b){ /* some random c++ code */ };
Run Code Online (Sandbox Code Playgroud)