C++ boost::asio::deadline\u计时器,带有std::chrono时间值

C++ boost::asio::deadline\u计时器,带有std::chrono时间值,c++,boost-asio,C++,Boost Asio,我有一个使用asio截止时间计时器的应用程序。应用程序的其余部分使用std::chrono构造作为其时间值,而仅对涉及asio的内容使用boost::posix_time会让人感到尴尬。如果可以,我想在整个应用程序中使用std::chrono,以确保一致性、可读性等 在我看来,答案可能涉及使用计时器的模板: typedef boost::asio::basic_deadline_timer<std::chrono::system_clock::time_point> my_d

我有一个使用asio截止时间计时器的应用程序。应用程序的其余部分使用
std::chrono
构造作为其时间值,而仅对涉及asio的内容使用
boost::posix_time
会让人感到尴尬。如果可以,我想在整个应用程序中使用
std::chrono
,以确保一致性、可读性等

在我看来,答案可能涉及使用计时器的模板:

typedef boost::asio::basic_deadline_timer<std::chrono::system_clock::time_point>
    my_deadline_timer_type;
 my_deadline_timer_type a_timer(io_service); 
typedef boost::asio::basic\u deadline\u计时器
我的截止日期计时器类型;
my_deadline_timer_类型a_timer(io_服务);
除此之外,在编译时会发生严重的错误…许多错误行,其中大多数类似于:

/opt/arm/include/boost/asio/deadline\u timer\u service.hpp:51:43:错误:无效使用不完整类型'boost::asio::deadline\u timer\u service>>,boost::asio::time\u traits>>>::traits\u type{aka struct boost::asio::time\u traits>>>'


因此,看起来我可能需要创建一个新的
traits\u类型
,并使用它声明一个
deadline\u timer\u服务
,但我不确定如何/在哪里。我不得不相信这个问题已经解决了。我在linux上使用g++4.7.3和-std=c++11,交叉编译到arm。

如果您使用的是boost 1.49或更高版本,ASIO引入了,它使用与c++11兼容的时钟,来自
std::chrono
boost::chrono
。他们还为增强版的
稳定时钟
系统时钟
高分辨率时钟
提供了预定义的typedef。它的功能与
deadline_timer
相同,但使用C++11时钟机制,而不是
boost::posix_time
结构

对于早期版本,您必须传递一个traits结构来处理转换到
deadline\u timer
所期望的类型。参见ASIO要求。大多数是琐碎的,最后一个不是。比如说

template<typename Clock>
struct CXX11Traits
{
  typedef typename Clock::time_point time_type;
  typedef typename Clock::duration   duration_type;
  static time_type now()
  {
      return Clock::now();
  }
  static time_type add(time_type t, duration_type d)
  {
      return t + d;
  }
  static duration subtract(time_type t1, time_type t2)
  {
      return t1-t2;
  }
  static bool less_than(time_type t1, time_type t2)
  {
      return t1 < t2;
  }

  static  boost::posix_time::time_duration 
  to_posix_duration(duration_type d1)
  {
    using std::chrono::duration_cast;
    auto in_sec = duration_cast<std::chrono::seconds>(d1);
    auto in_usec = duration_cast<std::chrono::microseconds>(d1 - in_sec);
    boost::posix_time::time_duration result =
      boost::posix_time::seconds(in_sec.count()) + 
      boost::posix_time::microseconds(in_usec.count());
    return result;
  }
};

谢谢你的详细回答,戴夫。
basic_waitable_timer
对我来说很好,因为我使用的是1.53。非常感谢。
typedef boost::asio::basic_deadline_timer< 
        std::system_clock,  
        CXX11Traits<std::system_clock>> my_system_clock_deadline_timer