Edu*_*yan 1 c++ lambda templates c++11 c++14
有没有办法让这段代码编译?我希望将我的比较函数作为lambda模板参数.
#include <iostream>
#include <set>
int main()
{
std::set<int*, [](int *a, int *b){return *a<*b;}> S;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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;
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我纠正代码,或解释为什么不可能?
Hol*_*olt 10
您的代码无效,因为:
[](int *a, int *b){return *a<*b;}
Run Code Online (Sandbox Code Playgroud)
...不是类型,它是(实现定义类型)的对象,因此您不能将其用作模板参数.
您可以先创建对象,然后使用decltype以下命令查找其类型:
auto comp = [](int *a, int *b){ return *a<*b; };
std::set<int*, decltype(comp)> S{comp};
Run Code Online (Sandbox Code Playgroud)
或者在C++ 20中,您可以直接应用decltype:
std::set<int*, decltype([](int *a, int *b){return *a<*b;})> S;
Run Code Online (Sandbox Code Playgroud)
由于lambda是无捕获的,另一种方法是使用比较器类型的函数指针类型,让编译器将无捕获的lambda转换为函数指针:
std::set<int*, bool (*)(int*, int*)> S([](int *a, int *b){ return *a<*b; });
Run Code Online (Sandbox Code Playgroud)