如何确保 lambda 的自动参数类型相同?

bra*_*ing 4 c++ lambda c++14

如果我有一个 lambda 函数

auto foo = [](auto && a, auto && b){ /* some random c++ code */ };
Run Code Online (Sandbox Code Playgroud)

即使该类型可以是任何类型,我如何声明ab应该是相同的类型?

lub*_*bgr 6

您可以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*.


Ayx*_*xan 6

我知道它标有 C++14,但这里有一个 C++20 解决方案,以防万一:

auto foo = []<typename T>(T && a, T && b){ /* some random c++ code */ };
Run Code Online (Sandbox Code Playgroud)