【问题标题】:Call member function on object vector在对象向量上调用成员函数
【发布时间】:2012-10-01 06:44:53
【问题描述】:

给定一个vector<Object>,其中Object 有一个函数run(),有没有办法在for_each 中调用run(),只使用std 函数/模板?

注意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)方式。

【问题讨论】:

    标签: c++ boost lambda foreach std


    【解决方案1】:

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

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

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

    【讨论】:

    • 快!顺便说一句,在 VS2010 上它只能用 mem_fun_ref(&amp;Object::run) 编译
    • 我的错误-我没有尝试,我用了很长时间:(
    【解决方案2】:

    对于任何感兴趣的人,这里有一个关于如何使用 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) );
    

    【讨论】:

    • 你的 lambda 需要捕获 c。另外,我认为 C++11 方式将是基于范围的 for 循环,而不是 std::for_each! :)
    • C++11 变量捕获已修复。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2018-06-25
    • 2010-09-26
    • 2012-04-20
    • 2015-05-01
    • 2014-08-07
    • 2013-12-01
    相关资源
    最近更新 更多