2

私は現在、コードの時点で、演算子に関する情報を保持する構造体をソートする必要がある構文アナライザー クラスを開発しています。各演算子には優先度があり、アナライザー クラスのパブリック メンバー関数を介してユーザーが定義します。したがって、並べ替えるときは、対応する演算子の優先度に基づいて要素を並べ替えるための並べ替え関数が必要です。次のコードを使用して要素を比較しています。

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

この関数はクラス内で定義されているため、静的にする必要があることに注意してください。

実際、私の比較関数は type の要素を比較し、フィールド「priority」を持つop_chartype の要素を含むマップから演算子 def を取得します。op_def

私が直面している問題は、なんとか使用できないことですstd::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp))(ここで ops はvector of op_info)メソッドです。次のエラーが表示されますが、これは非常に論理的に聞こえます:

エラー: 静的メンバー関数でのメンバー 'parser::operators' の使用が無効です

これが私の質問です: std::sort に、クラスの非静的メンバーからの要素を利用する comp 関数を強制的に使用させるにはどうすればよいですか? 明らかに関数は非静的であるべきですが、静的にしないとうまく使えません...

4

3 に答える 3

5

演算子も静的にすると、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で他の例を参照してください

于 2009-11-13T19:40:11.260 に答える
3

関数の代わりにファンクターを使用します。

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));
于 2009-11-13T19:55:12.650 に答える
3

op_comp を非静的にしたい場合は、Boost.Lambda または Boost.Bind を使用できます。

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));
于 2009-11-13T20:08:15.527 に答える