在对象向量上调用成员函数

时间:2012-10-01 06:44:53

标签: c++ boost lambda foreach std

给定vector<Object>,其中Object具有函数run(),是否可以使用std函数/模板在run()中调用for_each

请注意run()不是静态函数,它实际上应该转换被引用的对象(当然,在我的小例子中并非如此)

我知道boost::lambda方式

class Object
{
public:
    int run(){/* change object state */}
};

vector<Object> v(10);
for_each(v.begin(), v.end(), bind(&Object::run, _1));

但我很好奇它是否是一种标准(非Cxx11 )方式。

2 个答案:

答案 0 :(得分:7)

有C ++ 03方式:

for_each(v.begin(), v.end(), mem_fun_ref(&Object::run));

请参阅http://www.cplusplus.com/reference/std/functional/mem_fun_ref/

答案 1 :(得分:1)

对于任何有兴趣的人,这里有一个关于如何使用for_each

的更详细的例子
class Object
{
public:
    int run(){/* change object state */}
    int run2(char c){/* change object state */}
};

vector<Object> v(10);
char c = 'a';

如果你想向你的函数发送一个参数(最多一个,对于C ++ 03),你可以

for_each(v.begin(), v.end(), std::bind2nd( std::mem_fun_ref(&Object::run2), c));

请注意,您绑定第二个参数。第一个是指向当前对象的this指针。您是否记得任何成员函数始终以this作为第一个参数?

lambda方式(C ++ 11)更好!

for_each( v.begin(), v.end(), [&] (const Object& val)
{
    val.run();  
    // this is effectively the most flexible way to specify the function params
    val.run2(c); 
} );

最后, boost :: lambda 方式,适用于有参数的情况。 对于C ++ 11,它可以轻松扩展到更多参数

for_each(v.begin(), v.end(), bind(&Holder::run, _1, c) );
相关问题