首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么不能在本Boost.Asio教程中互换使用std::bind和boost::bind

为什么不能在本Boost.Asio教程中互换使用std::bind和boost::bind
EN

Stack Overflow用户
提问于 2012-01-29 03:59:11
回答 2查看 6.9K关注 0票数 18

我尝试了Boost.Asio文档中的不同教程,并尝试用C++11组件替换boost组件。但是,我在Timer.5 - Synchronising handlers in multithreaded programs中使用std::bind时出错。以下是建议的代码:

代码语言:javascript
复制
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer { /* Not relevent here */ };

int main()
{
  boost::asio::io_service io;
  printer p(io);
  boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
  io.run();
  t.join();

  return 0;
}

我试着用std::thread代替boost::thread,用std::bind代替boost::bind。下面是我的代码:

代码语言:javascript
复制
#include <functional>
#include <iostream>
#include <thread>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer { /* Not relevent here */ };

int main() {
    boost::asio::io_service io;
    printer p(io);
    std::thread t(std::bind(&boost::asio::io_service::run, &io));
    io.run();
    t.join();
}

在用GCC 4.7编译时,我得到了这个编译时错误:

代码语言:javascript
复制
g++ -std=c++0x main.cpp -lboost_system -lboost_date_time -lpthread
main.cpp: In function ‘int main()’:
main.cpp:52:60: erreur: no matching function for call to ‘bind(<unresolved overloaded function type>, boost::asio::io_service*)’
main.cpp:52:60: note: candidates are:
/usr/include/c++/4.6/functional:1444:5: note: template<class _Functor, class ... _ArgTypes> typename std::_Bind_helper::type std::bind(_Functor&&, _ArgTypes&& ...)
/usr/include/c++/4.6/functional:1471:5: note: template<class _Result, class _Functor, class ... _ArgTypes> typename std::_Bindres_helper::type std::bind(_Functor&&, _ArgTypes&& ...)

考虑到我没有使用任何boost::asio::placeholders (正如这个堆栈溢出问题Should std::bind be compatible with boost::asio?中所解释的),这个错误是从哪里来的?

EN

回答 2

Stack Overflow用户

发布于 2014-11-13 03:59:11

简单地说,在C++11以后的版本中,你可以使用lambda来避免所有的faff,并大大简化整个事情。旧的:

代码语言:javascript
复制
boost::thread t(boost::bind(&boost::asio::io_service::run, &io));

或std::版本:

代码语言:javascript
复制
std::thread t(boost::bind(static_cast<size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &io_service));

变得公正:

代码语言:javascript
复制
std::thread t([&io_service](){io_service.run();});
票数 18
EN

Stack Overflow用户

发布于 2013-01-03 03:33:35

这是一个巨大的皮塔来解决,所以感谢你Dietmar的提示。对于那些使用boost::bind的用户,您的解决方案如下所示:

代码语言:javascript
复制
// create the io_service    

boost::asio::io_service io_service;

 // assign some work to asio before starting
 {
    io_service.post(&some_work);   // just for example
    ....
 }

boost::thread t(boost::bind(static_cast<size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &io_service));

// work should be executed in a new thread

t.join()

return;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9048119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档