gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:07 25 4
gpt4 key购买 nike

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

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