c++ - 在比较函数中使用非静态类成员

标签 c++ class static sorting functor

我目前正在开发一个语法分析器类,它需要在代码的某个位置对包含运算符信息的结构进行排序。每个运算符都有一个优先级,这是用户通过我的分析器类的公共(public)成员函数定义的。因此,在排序时,我需要我的排序函数根据相应运算符的优先级对元素进行排序。我正在使用以下代码来比较元素:

bool parser::op_comp(const op_info& o1, const op_info& o2) {
    op_def& op1 = operators[o1.op_char];
    op_def& op2 = operators[o2.op_char];

    return op1.priority > op2.priority;
}

请注意,我必须将此函数设为静态,因为它是在类内部定义的。

事实上,我的比较函数比较 op_char 类型的元素,并且我从包含 op_def 类型元素的映射中检索运算符 def,它有一个字段“优先级”。

我面临的问题是我无法设法使用 std::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp))(其中 ops 是 op_info 的 vector ) 方法。我收到以下错误,这听起来很合乎逻辑:

错误:在静态成员函数中无效使用成员“parser::operators”

这是我的问题:如何强制 std::sort 使用一个 comp 函数,该函数利用来自类的非静态成员的元素?显然该函数应该是非静态的,但如果我不将其设为静态,我将无法使用它...

最佳答案

同时将运算符设为静态,您将能够在 op_comp 中使用它。

或者,使用仿函数代替函数:

class myCompareClass {
  public:
  bool operator() (
    const op_info& o1, const op_info& o2) { 
    op_def& op1 = operators[o1.op_char]; 
    op_def& op2 = operators[o2.op_char]; 

    return op1.priority > op2.priority; 
  }
  private:
    ... operators ...
} myCompareObject;

std::sort(ops.begin(), ops.end(), myCompareObject) 

查看更多示例 cplusplus.com

关于c++ - 在比较函数中使用非静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731404/

相关文章:

c++ - 为什么这个程序无法捕获异常?

c++ - 知道 QObject 名称是否已更改的最佳方法是什么

C++:链表表示

java - 我的 TestCircle java 代码运行不正确

c++ - 构造函数参数的 SFINAE

c++ - 影响C++中初始化的顺序

c++ - 在现实生活中管理 char *

c++ - '< >' 在 C++ 中意味着什么?

java - 为什么该类的每个对象对其成员具有相同的值?

html - 使图像相对于其父容器具有静态位置?