質問

私は現在、事業者に関する情報を保持する構造体をソートするために、コードの時点で、必要syntaxicアナライザクラスを開発しています。各オペレータは自分の分析クラスのパブリックメンバ関数を介してユーザー定義である優先度を有しています。ソート時にこのように、私は、対応するオペレータの優先順位に基づいて要素を注文する私のソート機能を必要としています。 I要素を比較するために、次のコードを使用しています:

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オペレータを取得ます。

私が直面してる問題は、私はOPSがstd::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp))方法です(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する

でより多くの例を参照してください。

あなたがBoost.LambdaやBoost.Bindを使用することができます非静的であるとop_compたい場合:

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top