これが以前に尋ねられたことがある場合は、申し訳ありませんが、適切な解決策を見つけることができません。
次のようなクラスのメンバー関数のファンクターを作成して、後でfind_ifまたはremove_ifに使用することがよくあります
class by_id{
public:
by_id(int id):mId(id) {}
template <class T>
bool operator()(T const& rX) const { return rX.getId() == mId; }
template <class T>
bool operator()(T* const pX) const { return (*this)(*pX); }
private:
int mId;
};
これは問題なく機能しますが、多くのボイラープレートと、比較に使用するすべてのメンバー関数のクラスを定義する手段が含まれています。
C++11 のラムダについては知っていますが、クロスコンパイラの制限により、新しい標準に切り替えることができません。
私が見つけた最も関連性の高い質問は、クラスメンバー関数の結果を伴う stl remove_if ですが、与えられた解決策は、比較のために追加のメンバー関数を追加することを意味します。これは醜いです。
標準の STL またはおそらくブーストを使用して、より一般的な方法でそのようなファンクターを記述したり、 bind を使用してそれらを完全にスキップしたりする簡単な方法はありませんか?
ジェネリック ファンクターのようなものでもいいのですが、私にはそれを書くスキルがありません。私が考えていることを明確にするために:
template<typename FP,typename COMP>
class by_id{
public:
by_id(COMP id):mId(id) {}
template <class T>
bool operator()(T const& rX) const { return rX.FP() == mId; }
//of course this does not work
template <class T>
bool operator()(T* const pX) const { return (*this)(*pX); }
private:
COMP mId;
};