繁体   English   中英

C++11:如何使用 lambda 作为类型参数,它需要像 std::less/std::greater 这样的“函子类型”?

[英]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,如何实现它?

有多种方式:

  1. 让编译器使用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);
  1. 使用<functional>标头显式指定 lambda 类型:
#include <functional>
...
priority_queue<int, vector<int>, function<bool(int, int)>> q(cmp);
  1. 使用函数对象类。 在这种情况下,您只需要将函数对象类指定为模板类型参数,而无需将 cmp 参数传递给构造函数,因为您自己定义的函数对象类有一个默认的(合成的)构造函数.
struct Cmp {
    bool operator()(int x, int y) {return x > y;}
};
priority_queue<int, vector<int>, Cmp> q;
  1. 尽可能使用库定义的函数对象。
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM