【问题标题】:boost::bind with functions that have parameters that are referencesboost::bind 与具有引用参数的函数绑定
【发布时间】:2010-10-02 23:20:12
【问题描述】:

我注意到在将引用参数传递给 boost 绑定时,这些参数不会像引用一样起作用。相反,boost 创建了成员的另一个副本,并且原始传入的变量保持不变。

当我更改对指针的引用时,一切正常。

我的问题是:

是否有可能获得对工作的引用,或者在尝试使用引用参数时至少给出编译错误?

【问题讨论】:

    标签: c++ boost-bind


    【解决方案1】:

    boost documentation for bind 建议您可以为此使用 boost::ref 和 boost::cref。

    【讨论】:

    • 例如void increment_int(int& x)如果在调用int tmp = 0时不小心忘记使用boost::ref,boost::function<void()> func = boost::bind(f, tmp) --> 执行函数时,tmp不会递增。相反,boost::bind 创建的对象保存了一个副本并使用该副本调用函数increment_int。欲了解更多信息,请参阅here。我还确保创建了一个简短的、自包含的、可编译的示例来测试/验证我所说的。
    【解决方案2】:

    每当绑定中使用的方法被声明为采用引用参数时,我遇到了类似的问题,希望通过引用传递绑定参数。然而,这种情况并非如此!无论方法如何声明,您都需要在 boost::ref() 或 boost::cref() 中显式包装绑定参数(即通过引用传递)。

    例子:

    ClassA myClassAParameter
    void Method(ClassA &param);
    

    现在,以下绑定:

    callback = boost::bind(&Method, myClassAParameter);
    

    实际上会复制 ClassA 对象(我知道这是一个临时分配,并且被调用的方法应该不保留对它的引用,因为这不是实际对象的引用,而是到对象的副本)。

    但是,以下绑定:

    callback = boost::bind(&Method, boost::ref(myClassAParameter));
    

    将不会复制,而是使用引用来创建绑定对象。

    【讨论】:

    • 谢谢!我正在使用 boost::asio Timer.5 来学习。并且想做一个通用的打印传递参数。
    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2011-10-03
    相关资源
    最近更新 更多