[英]C++11: return_type (for std::bind) of functor where return type is based on input type
[英]C++11: how to use lambda as type parameter, where it requires a "functor type" like std::less/std::greater?
我正在尝试将类型参数传递给 priority_queue,就像 std::less 或 std::greater 一样,如下所示:
priority_queue<int, vector<int>, [](int x, int y){return x>y;})> q;
它没有编译,然后我添加了decltype
,仍然失败:
priority_queue<int, vector<int>, decltype([](int x, int y){return x>y;}))> q;
问题是,我们可以在这种情况下使用 lambda,如何实现它?
有多种方式:
decltype(lambda)
推断 lamabda 的类型。 但是您需要记住一件事:在 C++20 之前,lambda 类型没有默认构造函数。 从 C++20 开始,只有无状态 lambda (没有捕获的 lambda)有默认构造函数,而有状态 lambda (即,有捕获的 lambda)没有默认构造函数(这在 cppreference.com 上有明确记录)。 为什么默认构造函数在这里很重要? 答案是,如果存在默认构造函数,则不必将比较函数 (cmp) 传递给 priority_queue 构造函数,只要将 lambda 类型指定为模板参数即可。 由于默认构造函数仅适用于从 C++20 开始的无状态 lambda,因此您最好将 cmp 参数显式传递给构造函数:auto cmp = [](int x, int y){return x>y;};
priority_queue<int, vector<int>, decltype(cmp)> q(cmp);
<functional>
标头显式指定 lambda 类型:#include <functional>
...
priority_queue<int, vector<int>, function<bool(int, int)>> q(cmp);
struct Cmp {
bool operator()(int x, int y) {return x > y;}
};
priority_queue<int, vector<int>, Cmp> q;
priority_queue<int, vector<int>, std::greater<int>> q;
')'
从
decltype([](int x, int y){return x>y;}))
decltype([](int x, int y){return x>y;})
它编译成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.