std::bind 是不是应该与 boost::asio 兼容?
Posted
技术标签:
【中文标题】std::bind 是不是应该与 boost::asio 兼容?【英文标题】:Should std::bind be compatible with boost::asio?std::bind 是否应该与 boost::asio 兼容? 【发布时间】:2012-02-13 23:59:28 【问题描述】:我正在尝试调整 boost::asio 示例之一,以尽可能使用 c++11 / TR1 库。原始代码如下所示:
void start_accept()
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
如果我将boost::bind
替换为std::bind
,如下所示:
void start_accept()
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->socket(),
std::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error ) );
// std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) );
我收到一条大错误消息,结尾为:
/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
我正在使用 gcc 4.4 版和 boost 1.47 版
我希望 boost::bind 和 std::bind 可以互换。
【问题讨论】:
std 从 boost 和 tr1 中得到了很多,但它们并不相同。我想知道这是否与this question有关 一张potentially related 票 @Sam Miller 我找到了票,但它已经 3 年没有更新了!我也尝试过针对 v1.48 的 boost,并使用 std::placeholders 而不是 boost::asio::placeholders。现在我坚持使用 boost::shared_ptr 和 boost::bind 作为 asio 代码。 我记得不久前遇到过类似的问题。您是否尝试过用 std::placeholders::_1 (或者可能是 _2)替换 boost::asio::placeholders::error 如果你有 std::bind 我猜你有 lambdas - 在这种情况下你可以这样做:[=](const boost::system::error_code& error) /*do code here or...*/ this->handle_accept(...)
。就个人而言,我已经完全停止使用 bind 并且我只是将它写成一个 lambda,无论 lambda 调用一个函数还是内联。我的想法是:当有一个语言功能可以做同样的事情时,为什么要使用库功能?我知道这不是你的问题,只是我的 0.02 美元
【参考方案1】:
我现在有一个解决方案
问题是当我第一次尝试切换到std::bind
和std::shared_ptr
时,我还在使用boost::asio::placeholders
和std::bind
,这导致了大量的模板编译器错误,所以我尝试了零碎切换。
我第一次尝试将 boost::shared_ptr
切换到 std::shared_ptr
,但失败了,因为 boost::bind
将无法与 std::shared_ptr
一起使用,如果没有专门针对 std::shared_ptr
的模板 get_pointer<typename T>
(请参阅:How to resolve conflict between boost::shared_ptr and using std::shared_ptr?) .
切换到 std::shared_ptr 后,我切换到 std::bind
,这次使用 std::placeholders
,(感谢 Richard)示例代码现在可以编译并正常工作。
要将std::bind
与boost::asio
一起使用,请确保同时使用std::shared_ptr
和std::placeholders
。
【讨论】:
请注意,通常从 boost 切换到 std::bind 时,std::shared_ptr 不是严格要求的。只有占位符是必需的,因为 std::bind 会专门查找它们。 可能需要提一下 boost::asio::placeholders::error 需要替换为 std::placeholders::_1。看到这个帖子:***.com/a/28521715/5058676以上是关于std::bind 是不是应该与 boost::asio 兼容?的主要内容,如果未能解决你的问题,请参考以下文章
std::bind 与 std::function 与 Clang 崩溃
C11新特性之std::function与std::bind