有没有办法让这段代码通过编译?我想将我的比较函数作为 lambda 模板参数。
#include <iostream>
#include <set>
int main()
{
std::set<int*, [](int *a, int *b){return *a<*b;}> S;
return 0;
}
我收到以下错误:
prog.cpp: In function ‘int main()’:
prog.cpp:6:17: error: lambda-expression in template-argument
std::set<int*, [](int *a, int *b){return *a<*b;}> S;
^
prog.cpp:6:51: error: template argument 2 is invalid
std::set<int*, [](int *a, int *b){return *a<*b;}> S;
任何人都可以帮我更正代码,或者解释为什么它不可能吗?
最佳答案
您的代码无效,因为:
[](int *a, int *b){return *a<*b;}
...不是类型,它是对象(实现定义的类型),因此您不能将它用作模板参数。
您可以先创建对象,然后使用 decltype
查找其类型:
auto comp = [](int *a, int *b){ return *a<*b; };
std::set<int*, decltype(comp)> S{comp};
或者在C++20中,你可以直接应用decltype
:
std::set<int*, decltype([](int *a, int *b){return *a<*b;})> S;
由于您的 lambda 是无捕获的,另一种方法是对比较器类型使用函数指针类型,并让编译器将无捕获的 lambda 转换为函数指针:
std::set<int*, bool (*)(int*, int*)> S([](int *a, int *b){ return *a<*b; });
关于c++ - 有没有办法将 lambda 表达式作为谓词模板参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50744727/