给定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 )方式。
答案 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) );