0

オブジェクトのベクトルがあるとします。ベクター内の各要素について、メンバーを介して関数を呼び出したいと思います。コードは次のように示すことができます。

class CMyClass
{
public:
   void g();
};

class CAnotherClass
{
public:
   void f();
   CMyClass m_object;
};

std::vector<CAnotherClass> vec;
// This is easy. What about m_object->g()?
std::for_each(vec.begin(), vec.end(), std::mem_fn(&CAnotherClass::f));

各オブジェクトの呼び出しf()は、上記のように簡単です。m_object->g()各オブジェクトを呼び出したい場合はどうすればよいですか? CAnotherClassうまくいけば、 のインターフェースを変更して、を呼び出すだけのダミー関数を追加したくありませんm_object->g()

ループを自分で作成せずに STL/ブーストする方法はありますか?

4

1 に答える 1

6

次のような別の関数を提供する必要があります。

void call_g(CAnotherClass & c) { c.m_object.g(); }

次に、それをに渡しstd::for_eachます。

std::for_each(vec.begin(), vec.end(), call_g);

コンパイラがラムダ(C ++ 11機能)をサポートしている場合は、使用時に関数を定義できるため、状況は改善されます。

std::for_each(vec.begin(), vec.end(), [](CAnotherClass & c) { c.m_object.g(); });

ただし、コンパイラがラムダをサポートしている場合は、C++11のもう1つの機能である範囲forループをサポートしている可能性があります。私の意見では、forループの範囲はstd::for_each時代遅れになっています。それははるかに簡潔です。

for (auto & c : vec) { c.m_object.g(); }
于 2013-01-10T04:54:03.570 に答える