4

给定 a vector<Object>,其中 Object 有一个 function run(),有没有办法只使用 std 函数/模板来调用run()a ?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)方式。

4

2 回答 2

7

有(曾经)C++ 03 方式:

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

http://www.cplusplus.com/reference/std/functional/mem_fun_ref/

于 2012-10-01T06:50:22.910 回答
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) );
于 2012-10-01T14:06:54.980 回答