【问题标题】:Should I be seeing significant differences between std::bind and boost::bind?我是否应该看到 std::bind 和 boost::bind 之间的显着差异?
【发布时间】:2013-06-29 00:49:30
【问题描述】:

我正在探索 g++-4.7(具体来说是 Ubuntu/Linaro 4.7.3-2ubuntu~12.04)上对 C++11 的支持,我似乎正在寻找差异。

特别是,如果我在 Boost ASIO 异步客户端示例(取自 http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp)中注释掉 #include <boost/bind.hpp> 并系统地将出现的 boost::bind 替换为 std::bind,则程序不再编译。

对此有何解释?

【问题讨论】:

  • 能否请您做一个失败的替换(最好是单个替换)并将修改后的代码与编译器错误一起发布?
  • 我记得曾见过嵌套绑定的不同行为。现在不记得具体的了。然而,这不是你在这里遇到的。

标签: c++ c++11 boost boost-asio stdbind


【解决方案1】:
#include <functional>
namespace boost {
    namespace asio {
        namespace stdplaceholders {
            static decltype ( :: std :: placeholders :: _1 ) & error = :: std :: placeholders :: _1;
            static decltype ( :: std :: placeholders :: _2 ) & bytes_transferred = :: std :: placeholders :: _2;
            static decltype ( :: std :: placeholders :: _2 ) & iterator = :: std :: placeholders :: _2;
            static decltype ( :: std :: placeholders :: _2 ) & signal_number = :: std :: placeholders :: _2;
        }
    }
}

并使用boost::asio::stdplaceholders::* 而不是boost::asio::placeholders::*

【讨论】:

    【解决方案2】:

    看起来boost::asio::placeholders 不能与std::bind 一起使用。在您链接到的示例中,对boost::bind 的第一次调用发生在以下代码中:

    resolver_.async_resolve(query,
        boost::bind(&client::handle_resolve, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::iterator));
    

    简单地将boost::bind 替换为std::bind 会导致一堆错误。要使其编译,您需要将 boost::asio::placeholders 替换为 std::placeholders

    resolver_.async_resolve(query,
        std::bind(&client::handle_resolve, this,
          std::placeholders::_1,
          std::placeholders::_2));
    

    请注意,在进行这些更改后,我尚未验证代码在功能上是否相同,只是可以编译。

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2016-05-25
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多