我正在探索使用boost :: asio以及C++ 11功能.特别是,我专注于一个名为"async_tcp_echo_server.cpp"的示例,位于此处(代码也显示在我的问题的末尾):
我的问题涉及到tcp::socket成员socket_的的server类.在类的do_accept()方法中server,socket_传递给async_accept().(根据asio文档,async_accept()要求,作为其第一个参数,socket接受连接进入.)到目前为止,这么好.
下一个参数,即异步接受操作的回调,是一个lambda函数.lambda的主体构造一个新session对象,其构造函数也需要相同的对象socket.有趣的是,socket对象无法复制; 所以在这个例子中,使用了传递对象socket_成员的server对象std::move().
我知道"唯一的" socket_对象(它是对象的"永久"成员server)被"移动"到session对象中.精细 - socket物体不会被复制,而是被移动 - 每个人都很开心.
但是下次打电话会发生什么async_accept()?是否相同socket_(成员server),之前被移动,再次传入?当我们"移动"一个成员时,留下了什么?有无限socket物体的神奇喷泉吗?
或者这里发生的事情真的不那么明显了?当socket移入时session,"遗留/移动"对象(socket_成员server)的内容是否与"新" 对象自己的"尚未构建" 成员的内容交换?我甚至有意义吗?sessionsocket_
代码如下.程序流程相当简单.main()构造一个server对象.该 …
我有一个模板化函数,它接受一个整数类型并对两个输入参数执行数学运算:
template<typename T, typename R>
R multiply( const T& lhs, const T& rhs ) {
R ans = static_cast<R>( lhs ) * static_cast<R>( rhs );
return ans;
}
Run Code Online (Sandbox Code Playgroud)
(为简单起见,假设类型T和R始终是无符号整数类型,或者我执行合适的检查以确保.)
在这个人为的例子中,你可以看到我正在做一个简单的乘法(仅用于说明).我们的想法是传递一个类型为R的类型R,其类型为T的两倍.这将允许完整的产品适合返回值:
uint64_t Product64 = multiply<uint32_t,uint64_t>( 0xFFFFFFFF, 0xFFFFFFFF );
uint16_t Product16 = multiply<uint8_t,uint16_t>( 0xFF, 0xFF );
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方法可以省去第二个模板参数,并在编译时自动计算[类型T] [至少]两倍多位宽的类型.
注意:只使用R的最大可用积分类型(uint64_t)对我来说不是解决方案.理想情况下,我想要一个编译时计算类型,其大小足以容纳两倍于T的类型(例如,当T = uint8_t,R = uint16_t时).
在我看来,应该可以使用limit或type_traits或类似的东西,但到目前为止我还没有想到解决方案.C++ 11或更高版本没问题.我宁愿避免提升,但如果这是唯一的方法,我也有兴趣看到基于提升的解决方案.