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

如果我有一个 lambda 函数

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

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

回答

您可以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!");
};

您可能想要调整实例化的类型std::is_same,例如在比较时不考虑const- 或volatile限定符等(想想std::decay)。但请注意,可能存在如下问题:

foo("abc", "de"); // fails to compile

因为这里的推导类型是字符数组,而不是const char*.


回答

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

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


以上是如何确保lambda的自动参数类型相同?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>