0

カスタムリストクラスがあり、STLで知られている「比較演算子」を使用した操作をサポートしたいと思います。例えば:

std::list<MyClass> d;
struct not_key {
    not_key( std::string const& str) : str_(str) {}

    bool operator( MyClass& elem ) {
        return !elem.findThatThing();
    }

    std::string str_;
};


not_key comp("value");
d.remove_if( comp );

mylist<MyClass> e(d);
e.filter( comp );

そして、私はこれらの「一般的な」比較演算子を受け入れるメソッドのシグネチャについて苦労しています。それらはすべて異なるタイプであり、静的メンバー関数は必要ないためです。比較演算子を受け入れるメソッドをクラスに追加するにはどうすればよいですか?

どうもありがとうございます!:)

4

3 に答える 3

4

mylist::filter の署名を知りたい場合は、おそらく Pred などの型を持つテンプレートにするだけです。

template< typename T >
class mylist
{
   public:
      template< typename Pred >
      void filter( Pred pred )
      {
          // implement, calling pred(elem) for each element or pred(*iter)
      }
};

フリー関数をそのテンプレート関数に渡すことができ、C++11 ではラムダを渡すことができることに注意してください。

テンプレートではないもの(要素タイプ以外)が必要な場合は、boost::function(またはstd::function)を使用できます

于 2013-02-19T15:03:52.047 に答える
3

標準関数 ( などstd::sort) は、比較関数のようなオブジェクトの型であると推定されるテンプレート引数を使用します。

template <class UnaryPredicate>
void filter(UnaryPredicate func) {
  // Call it like:
  func(something);
}

UnaryPredicateこれで、渡された関数のようなオブジェクトの型であると推測されます。UnaryPredicate単一の引数しかとらないため、比較関数と呼ぶよりも理にかなっています。比較関数は通常、2 つの引数を取り、それらを比較します。

または、次のようにすることもできますstd::function<bool(const MyClass&)>

void filter(std::function<bool(const MyClass&)> func) {
  // Call it like:
  func(something);
}
于 2013-02-19T15:02:16.757 に答える
1

署名は次のとおりです。

bool operator()(Myclass const & elem) const
于 2013-02-19T15:00:38.923 に答える