【问题标题】:Is a functor returned by boost::bind with only bound arguments equivalent to a function that takes no arguments?boost::bind 返回的函子是否仅具有绑定参数,是否等效于不带参数的函数?
【发布时间】:2018-02-27 13:37:38
【问题描述】:

假设一个 API 请求一个函数 f 必须具有签名 void function()。以下代码示例是否满足此要求?

 void func(int i)
 {
       do_something(i);
 }

 int main(int argc, char* argv[])
 {
    int i = 3;
    auto f = boost::bind(func, i);
 }

换句话说:f 在这种情况下是否满足给定 API 的要求?

编辑:我的问题对“功能”一词有点含糊。澄清一下:f 应该是类似函数的,所以是一个简单的函数或函数对象。当我在 Boost.ASIO 中使用 strands 时,我提出了这个问题的具体案例。 Here,文档中提到了strand::post 的可能处理程序:

要调用的函数对象。执行器将根据需要制作处理程序对象的副本。函数对象的函数签名必须是:void function();

那么:上例中的f 是具有strand::post 正确签名的函数对象吗?

【问题讨论】:

  • 在 c++11 中你可以跳过 boost::bind 并写 auto f = [i] {func (i);};
  • API 是否需要函数或类似函数的东西?比如struct dummy { void operator() {} };wotk?

标签: c++ boost boost-bind


【解决方案1】:

上面例子中的 f 是一个函数对象,具有正确的 strand::post 签名

是的,std::bind 返回的函子是io_service::strand::post 的有效函子。 std::bind 就是为此目的而存在的,它将参数与值绑定并减少其计数以满足 API 的要求。

【讨论】:

  • 大多数现代 API(例如 stl)可以接受函数指针或仿函数
  • @user463035818 OP 肯定说 API 请求一个函数。
  • @user463035818 所以任何答案都是正确的。如果有人写是,我投票赞成答案。
  • @user463035818 是的,我们同意答案是否定的。如果 OP 提出这样的问题,我推断 OP 表示指向函数的指针,并且 OP 遇到了问题。
  • @user463035818 在 OP 更新问题后,我已经更新了我的答案。
【解决方案2】:

不,因为std::bind returns an unspecified object. 需要有cetain 成员和方法,仅此而已。如果确切的返回类型无关紧要,那么它可能满足要求,但严格来说它不是一个函数。

编辑:

在澄清问题后,答案是严格,因为这个未指定的对象必须按照strand::post 要求的方式行事。

【讨论】:

  • 自澄清问题以来,此答案不再正确。 “换句话说:f 在这种情况下是否满足给定 API 的要求?”的答案。在这里严格来说是“是”。
猜你喜欢
  • 2010-10-02
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多