私は、メンバー関数を持つstd::vector
ポインターPerson
オブジェクトを持っていますstd::string getName() const
。STL アルゴリズムを使用して、 「Chad」Person
を返すベクトル内のすべてのオブジェクトをカウントしたいと考えています。getName()
ループを単純に反復する動作は次のようになります。
int num_chads = 0;
for(std::vector<Person *>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
if((*it)->getName() == "Chad")
++num_chads;
}
これを作り直して、すべての STL アルゴリズムとファンクターなどを使用するようにします (より機能指向にします)。これは私がする必要があると私が思うことです:
const int num_chads = std::count_if(vec.begin(), vec.end(),
std::bind1st(std::bind2nd(std::equal_to, mem_fun(Person::getName)), "Chad"));
おそらくおわかりのように、これは機能しません。まず、私が理解しているように、 bind1st/bind2nd オブジェクトは bind1st/binder2nd オブジェクトで動作するように特別に設計されているため、使用できませんstd::binary_functions
。第二に、そしてもっと重要なことに、私は正しいテクニックを使っているとは思いません. 引数の1つを「チャド」にバインドしたいのですが、イテレータ引数を使用すると、実際には、バインドされたバージョンの を呼び出す前に、イテレータ値を文字列に変換したいだけですequals_to
。
Boost を使用してこれを行うことは可能だと思いますが、コア C++03 だけを使用して (つまり、C++0x ランバを使用しないで) 可能ですか?
編集: ユーザー定義の述語を使用しない (つまり、std ツールキットで提供されるツールを使用するだけの) 例を思いつく人はいますか?
編集: Matthieu の回答は STL アルゴリズムでファンクタを使用する方法についての教科書的な回答ですが、Cubbi の回答は私が探していたアプローチからのものでした (ただし、Mathieu は質問を編集してより具体的にする前に回答したため、お詫びします!)。