有没有办法将lambda表达式作为谓词模板参数传递?

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)