C++ 在比较函数中使用非静态类成员
我目前正在开发一个syntaxic Analyzer类,它需要在代码的某一点上对包含运算符信息的结构进行排序。每个操作员都有一个优先级,该优先级由用户通过我的Analyzer类的公共成员函数定义。因此,在排序时,我需要我的排序函数根据相应运算符的优先级对元素进行排序。我使用以下代码来比较元素: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
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对象。我对这个网站上的快速和良好的回答以及人们的友善印象深刻。非常感谢。这是一个非常好的解决方案!非常感谢。