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

标签 c++ c++11 templates lambda c++14

有没有办法让这段代码通过编译?我想将我的比较函数作为 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/

相关文章:

c++ - MATLAB 并行工具箱,remoteParallelFunction : RUNTIME_ERROR during function evaluation

C++ boost 库 - 正确处理日期序列内存分配错误

c++ - 如果我在 C++ 中实现operator<,我是否也应该实现operator> 和operator==?

c++ - C++多人网络游戏中的OpenID认证

c++ - 是否可以使用 Poco::Net::Sockets 连接到域套接字?

c++ - 在所有 std::futures 完成之前从函数返回是否安全?

C++11:我可以从多个 args 转到 tuple,但我可以从 tuple 转到多个 args 吗?

c++ - 类模板部分特化问题

templates - 如何引用 Sencha Touch XTemplate 中的项目数?

c++ - 模板函数调用歧义错误