如何在模板类中使用 lambda 作为 STL Compare 方法?

Posted

技术标签:

【中文标题】如何在模板类中使用 lambda 作为 STL Compare 方法?【英文标题】:How to use lambda as STL Compare method in a template class? 【发布时间】:2019-02-06 00:17:30 【问题描述】:

我正在尝试实现一个priority_queue,它包含A<T> 对象并使用自定义Compare 方法/类型。根据reference example,这是我的代码:

template <class T>
class A
    T value;
    A(T _value):value(_value)
;

template <class T>
class ProblematicClass

    auto cmp = [](A<T>* l, A<T>* r) return l->value > r->value; ;

    std::priority_queue < A<T>*, std::vector<A<T>*>, decltype(cmp) > q(cmp);
;

但我收到以下错误:

错误 C2853:“cmp”:非静态数据成员的类型不能包含“auto”

我尝试将 lamda 定义为static,但它导致了一个新的语法错误:

错误 C2143:语法错误:在“返回”之前缺少“”

你能帮帮我吗?

更新:我正在使用 VS2013

【问题讨论】:

您需要比“它不起作用”更具描述性,因为它可能不起作用的方式数不胜数。此外,it appears to work 至少在 GCC 8.2 上。 【参考方案1】:

不必将cmp 设为静态。相反,您可以这样做:

template <class T>
class A
    T value;
    A(T _value):value(_value)
;

template <class T>
class ProblematicClass

    std::function<bool(A<T>*, A<T>*)> cmp = [](A<T>* l, A<T>* r) return l->value > r->value; ;

    std::priority_queue < A<T>*, std::vector<T>, decltype(cmp) > q;
;

不要忘记包含 &lt;functional&gt; 以使其正常工作。

【讨论】:

谢谢。它正在工作。一个后续问题:将cmp 定义为 static 是否可能/更好,因为它是类的共享实体? (顺便说一句,只需添加 static 关键字会产生语法错误) 有可能。使用 static auto cmp 甚至适用于 GCC 4.9.2。不确定VS 2013。根据我的说法,应该是static【参考方案2】:

对我来说 static 完美运行

static auto cmp = [](A<T>* l, A<T>* r) return l->value > r->value; ;

对于非静态...通过using 怎么样?

using lType = decltype([](A<T>* l, A<T>* r) return l->value > r->value; );

lType cmp = lType;

【讨论】:

添加 static 后,该行的错误更改为:error C2143: syntax error : missing '' before 'return' @Emadpres - 抱歉,但是...我无法复制。 我用的是VS2013

以上是关于如何在模板类中使用 lambda 作为 STL Compare 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 lambda 表达式作为模板参数?

C ++ lambda作为函数的模板参数不起作用

c++ 使用友好类的类型作为模板参数声明 stl 向量

C++ STL学习 —— 模板泛型算法函数对象lambda 表达式(参数捕获)函数适配器

C++ STL学习 —— 模板泛型算法函数对象lambda 表达式(参数捕获)函数适配器

C++ STL学习 —— 模板泛型算法函数对象lambda 表达式(参数捕获)函数适配器