次の場合:
struct Foo
{
int bar() const;
};
struct IsEqual : public std::unary_function<Foo*, bool>
{
int val;
IsEqual(int v) : val(v) {}
bool operator()(const Foo* elem) const
{
return elem->bar() == val;
}
};
私はのコンテナを持っており、Foo*
を使用std::find_if
して、指定された値とは異なるものを返すstd::not1
要素がコンテナ内にあるかどうかを調べます。bar()
コードは次のようになります。
// Are all elements equal to '2'?
bool isAllEqual(const std::vector<Foo*> &vec)
{
return find_if(vec.begin(), vec.end(), std::not1(IsEqual(2))) == vec.end();
}
将来に向けて早送りすると、今度はを含む別のコンテナができましたstd::tr1::shared_ptr<Foo>
。のオーバーロードされたバージョンでファンクターを再利用したいだけですisAllEqual()
。しかし、私はできません。 Foo*
とshared_ptr<Foo>
は異なるタイプです。unary_function
そして、を使用できるように、から継承する必要がありますnot1
。同じファンクターを2回書くのを避けられれば、もっとエレガントになるでしょう。
質問:
IsEqual
生のポインターとスマートポインターの両方を使用できるように書く方法はありますか?- 使って手錠をかけました
std::not1
か?IsNotEqual
代わりに書くべきですか?
制限:
- Boostライブラリの何も使用できません。
- 私たちのコンパイラは、C++0xラムダをサポートするのに十分なほどクールではありません。