我目前正在开发需要,在代码中的一个点,持有约运营商信息结构排序syntaxic分析类。每个操作员具有优先级,这是通过我的分析器类的公共成员函数用户定义的。因此,排序时,我需要我的排序功能订购基于相应运营商的优先内容。我使用以下代码来比较元素:

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是vector of op_info)方法得到以下的错误,这听起来很合乎逻辑的:

错误:在静态成员函数无效使用的构件`解析器::运营商的

下面是我的问题:我怎么能强迫的std ::排序使用补偿功能,使得使用从类的非静态成员的元素?显然,函数应该是非静态的,但我不能设法使用它,如果我不让它静态...

在此先感谢您的帮助, CFP。

有帮助吗?

解决方案

使用代替的功能的算符:

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;
};

此方式,方法op_comp可以留非静态的。然而,调用者需要解析器,在哪里都是运营商存储的实例。这是我们的新仿函数的用法:

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

在哪里my_parser是您正在使用的解析器的实例。可替代地,如果从解析器主叫std::sort,可以简单的写:

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

其他提示

请运营商静,以及,你就可以在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

的更多示例

如果你想op_comp是非静态的,你可以使用Boost.Lambda或Boost.Bind:

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top