クラス オブジェクトのベクトルがあるとします。
vector<Object1> vec;
たとえば、Object1
メンバー関数がありますvoid foo(Object2*)
。
私は次のことをしたい:
for(int i=0; i<vec.size(); i++) {
vec[i].foo(obj2);
}
明示的なループを使用せずにこれを行うにはどうすればよいですか?
TR1/C++11 で最も簡単:
#include <vector>
#include <functional>
#include <algorithm>
struct Object2{};
struct Object1 {
void foo(Object2*) {}
};
int main() {
std::vector<Object1> vec;
Object2 obj2;
std::for_each(vec.begin(), vec.end(), std::bind(&Object1::foo, std::placeholders::_1, &obj2));
}
ただし、 std::for_each
with をstd::bind2nd
使用することもできstd::mem_fun_ref
ます。それがオプションでない場合:
std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2));
古いスタイルの 1 つは、ファンクターを手動で記述することです。より複雑なロジックの場合、これにより、クラス全体を問題に専念させることができます。
class fancyFunctor
{
Object2* m_data;
public:
fancyFunctor(Object2 * data) : m_data(data){}
operator()(Object1 & ref)
{
ref.foo(m_data)
}
}
次に繰り返します:
std::for_each(vec.begin(),vec.end(), fancyFunctor(&randomObject2));
このようなコードの可読性は完全ではなく、単純な 1 行の方法では実行できません。これは、あるクラスのメンバーメソッドの最初の引数が、このクラスのオブジェクトへのポインターであり、その上で実行されるためです。
別の方法として、新しい C++11 標準に付属する foreach ループを使用することもできます (ただし、これはまだループです)。