gpt4 book ai didi

c++ - 如何绕过 C++ 无法使用 lambda 匹配模板中的函数类型

转载 作者:行者123 更新时间:2023-12-01 14:34:00 24 4
gpt4 key购买 nike

如果您有以下过滤列表模板:

template <typename T>
inline std::list<T> list_filter(std::list<T> const& a, bool (f)(T)) {
std::list<T> output;
std::copy_if(a.begin(), a.end(), std::back_inserter(output), f);
return output;
}

然后尝试用里面的 lambda 调用它,例如:

std::list<int> lst = {1,2,3,4,5};
auto filtered = list_filter(lst, [](int el) -> bool { return (el % 2 == 0); });

它将产生错误 no matching function for call to list_filter(..., std::__cxx11::list<int>)::<lambda(int)>)' .

有没有什么方法可以绕过这个限制而不用将 lambda 提取到单独的函数中?为什么 C++ 不允许这种明显的模式?

最佳答案

隐式转换(从没有捕获列表的 lambda 到函数指针)不会在 template argument deduction 中考虑,它无法在第二个函数参数上推断出模板参数 T

Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.

您可以通过 static_castoperator+ 将 lambda 显式转换为函数指针。例如

auto filtered = list_filter(lst, +[](int el) -> bool { return (el % 2 == 0); });

或者使用std::type_identity (C++20 起)从推导中排除第二个函数参数。例如

template <typename T>
inline std::list<T> list_filter(std::list<T> const& a, bool (f)(std::type_identity_t<T>)) {
...
}

顺便说一句,如果您的编译器不支持 C++20,您可以轻松创建自己的 type_identity

关于c++ - 如何绕过 C++ 无法使用 lambda 匹配模板中的函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63682627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com