Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::asio与boost::独特的未来_C++_Boost Asio_Boost Thread - Fatal编程技术网

C++ boost::asio与boost::独特的未来

C++ boost::asio与boost::独特的未来,c++,boost-asio,boost-thread,C++,Boost Asio,Boost Thread,根据,我们可以将boost::asio与std::future一起使用。但是我找不到任何关于使用boost::unique\u future的信息,它有更多的功能,比如then()。如何使用?Boost.Asio仅提供异步操作的一流支持,以返回C++11std::future或中的实际值。尽管如此,本文还是介绍了如何为其他类型(如Boost.Thread)自定义返回类型。它要求: 模板的特殊化。此模板用于根据异步操作的签名确定要使用的实际处理程序 模板的特殊化。此模板用于确定返回类型和从处理程

根据,我们可以将boost::asio与
std::future
一起使用。但是我找不到任何关于使用
boost::unique\u future
的信息,它有更多的功能,比如
then()
。如何使用?

Boost.Asio仅提供异步操作的一流支持,以返回C++11
std::future
或中的实际值。尽管如此,本文还是介绍了如何为其他类型(如Boost.Thread)自定义返回类型。它要求:

  • 模板的特殊化。此模板用于根据异步操作的签名确定要使用的实际处理程序
  • 模板的特殊化。此模板用于确定返回类型和从处理程序中提取返回值

下面是一个最小的完整示例,演示如何返回
boost:unique_future
,并在一系列由。为了保持示例的简单性,我选择只对示例中使用的异步操作签名专门化
handler\u type
。作为一个完整的参考,我强烈建议您进行回顾和讨论

#包括//current_exception,make_exception\ptr
#包括//make_shared,shared_ptr
#包含//线程
#包括//移动
#定义BOOST\u结果\u使用\u DECLTYPE
#定义BOOST\u线程\u提供\u未来\u延续
#包括
#包括
#包括
///@brief类用于指示异步操作应返回
///独特的未来。
类use_unique_future_t{};
///@brief一个特殊值,类似于std::nothrow。
constexpr使用唯一未来不使用唯一未来;
名称空间详细信息{
///@brief Completion handler将boost::promise改编为Completion
///处理程序。
模板
类唯一\u承诺\u处理程序;
///@brief Completion handler将一个void boost::promise改编为一个Completion
///处理程序。
模板
类唯一\u承诺\u处理程序
{
公众:
///@来自使用的简短构造\u唯一\u未来特殊值。
显式唯一承诺处理程序(使用唯一未来处理程序)
:promise_u(std::make_shared())
{}
void运算符()(常量boost::system::error\u代码和错误)
{
//出现错误时,将错误代码转换为异常并将其设置为启用
//承诺。
如果(错误)
承诺->设置例外(
std::make_exception_ptr(boost::system::system_error(error));
//否则,请设置该值。
其他的
承诺->设置值();
}
//私人:
std::共享的承诺;
};
//确保从处理程序引发的任何异常都传播回
//通过未来呼叫。
模板
无效asio\u处理程序\u调用(
功能,
唯一的\u承诺\u处理程序*处理程序)
{
//保证承诺在函数调用期间有效。
std::共享承诺(处理程序->承诺);
尝试
{
函数();
}
捕获(…)
{
承诺->设置异常(std::current_exception());
}
}
}//名称空间详细信息
名称空间提升{
名称空间asio{
///@brief Handler type专门化以备将来使用。
模板
结构处理程序类型<
使用独特的未来,
返回类型(boost::system::error\u code)>
{
typedef::detail::unique\u promise\u处理程序类型;
};
///@brief Handler traits专门用于唯一的\u promise\u处理程序。
模板
类异步\u结果<::细节::唯一\u承诺\u处理程序>
{
公众:
//启动函数将返回boost::unique\u future。
typedef boost::唯一的未来类型;
//构造函数为异步操作创建一个新的承诺,并获得
//相应的未来。
显式异步\u结果(::详细信息::唯一\u承诺\u处理程序和处理程序)
{
value_uu=handler.promise_uu->get_future();
}
//获取要从启动函数返回的未来。
键入get(){return std::move(value)}
私人:
类型值;
};
}//名称空间asio
}//名称空间提升
int main()
{
boost::asio::io_服务io_服务;
boost::asio::io_服务::工作工作(io_服务);
//在自己的线程中运行io_服务,以演示将来的用法。
线程线程([&io_服务](){io_服务.run();});
//臂3秒定时器。
boost::asio::截止时间计时器(
io_服务,boost::posix_时间::秒(3));
//异步等待计时器,然后执行基本计算
//在未来的延续中。
boost::独特的未来结果=
timer.async\u wait(使用\u unique\u future)
。然后([](boost::unique_future){
标准::cout