【问题标题】:std::tr1::function assignment and bindingstd::tr1::函数赋值和绑定
【发布时间】:2012-02-07 15:29:28
【问题描述】:

我正在尝试学习如何最好地使用 std::function 和 std::bind 工具 在标准库中 - 我对 TR1 版本感兴趣,因为这就是我 目前可用,我不知道 TR1 实现和 C++11 实现之间的差异(如果有的话)。

因此,为了练习,我设置了一个简单的“调度程序”。 我想要的是能够根据稍后在运行时做出的一些决定执行调度程序的任何功能。我将我的班级设置为具有通用功能数据 像这样的成员:

class PoorDispatcher
{
 ...
 private:
     std::tr1::function<void()> m_f;
}

然后我将我真正想调用的函数分配给数据成员,类似于下面

...
m_f = std::tr1::bind(some_func, param1, param2, param3);
...
// then the call
m_f(); // SUCCESS

以上允许我成功调用我想要的函数,但我不确定这是正确的做法。问题:

  1. 上述使用场景是否“正常”?有没有更好的选择?
  2. 上述方法在尝试绑定到返回某些内容的函数时会出现问题。如何检索返回值? (在我的愚蠢中,我厌倦了强制转换函数对象而没有成功)

【问题讨论】:

    标签: c++ templates tr1


    【解决方案1】:

    std::function 的模板参数是实际的函数类型。 void() 表示不带参数也不返回值的函数。

    如果你想存储一个返回值的函数,你必须创建一个新的函数对象。或者如果您不确定该函数是否会返回某些内容,请使用boost.optional

    【讨论】:

    • 我知道这是实际的函数类型。如果我使用 bind,函数调用将起作用,它会使用参数调用我的函数,尽管 m_f 的类型是“void()”。我不能使用boost,我必须坚持TR1。如果可能的话,我想避免创建一个新的函数对象。
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多