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

C++ 在比较函数中使用非静态类成员,c++,class,static,sorting,functor,C++,Class,Static,Sorting,Functor,我目前正在开发一个syntaxic Analyzer类,它需要在代码的某一点上对包含运算符信息的结构进行排序。每个操作员都有一个优先级,该优先级由用户通过我的Analyzer类的公共成员函数定义。因此,在排序时,我需要我的排序函数根据相应运算符的优先级对元素进行排序。我使用以下代码来比较元素: bool parser::op_comp(const op_info& o1, const op_info& o2) { op_def& op1 = operators[o

我目前正在开发一个syntaxic Analyzer类,它需要在代码的某一点上对包含运算符信息的结构进行排序。每个操作员都有一个优先级,该优先级由用户通过我的Analyzer类的公共成员函数定义。因此,在排序时,我需要我的排序函数根据相应运算符的优先级对元素进行排序。我使用以下代码来比较元素:

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;
}
注意,我必须使这个函数成为静态的,因为它是在类内部定义的

事实上,我的compare函数比较
op_char
类型的元素,我从包含
op_def
类型元素的映射中检索运算符def,这些元素具有字段“priority”

我面临的问题是我无法使用
std::sort(ops.begin(),ops.end(),std::mem\u fun\u ref(&parser::op\u comp))
(其中ops是op\u信息的
向量)
方法。我发现以下错误,听起来很符合逻辑:

错误:在静态成员函数中无效使用成员“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) 
struct op_comp : std::binary_function<op_info, op_info, bool>
    {
    op_comp(parser * p) : _parser(p) {}
    bool operator() (const op_info& o1, const op_info& o2) {
        return _parser->op_comp(o1, o2);
    }
    parser * _parser;
};

有关更多示例,请参见

使用函子代替函数:

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) 
struct op_comp : std::binary_function<op_info, op_info, bool>
    {
    op_comp(parser * p) : _parser(p) {}
    bool operator() (const op_info& o1, const op_info& o2) {
        return _parser->op_comp(o1, o2);
    }
    parser * _parser;
};
其中
my_parser
是您正在使用的解析器的实例。或者,如果您正在从解析器调用
std::sort
,您只需编写:

std::sort(ops.begin(), ops.end(), op_comp(this));

如果希望op_comp为非静态,可以使用Boost.Lambda或Boost.Bind:

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));

+1.使用TR1
std::TR1::bind
(如果可用);否则
boost::bind
。谢谢!但是我的问题是
操作符的内容取决于我处理的
解析器的哪个实例。我意识到,另一个解决方案是,在创建这样一个对象时,只需将“优先级”信息复制到每个op_info对象。我对这个网站上的快速和良好的回答以及人们的友善印象深刻。非常感谢。这是一个非常好的解决方案!非常感谢。