[英]Socket pointer transfer of ownership with tcp::acceptor::async_accept
我最近开始在一个项目中使用Boost.Asio,并想知道是否有人知道一个干净的解决方案,将新创建的套接字的所有权转移到tcp :: acceptor :: async_accept,这将依次将此所有权转移到接受处理函数。
请注意,这不是一种不连贯的愿望,因为处理程序只需要调用一次。
我注意到我不能std :: bind()一个std :: unique_ptr <>作为参数,因为std :: bind()要求它的参数是CopyConstructible,这是正确的。 不仅如此,Boost的AcceptHandler概念也必须是CopyConstructible。
所以我的选择是:
要么
我在这里几乎不知所措。 任何人都可以开导我吗?
我试图找到一种方法来使用c ++ 0x标准库,但不能。 最后我决定编写自己的rvalue_reference_wrapper和rvalue_ref()便利类。 与std :: bind一样,你需要将非可复制对象包装在可复制的东西中(reference_wrapper是最好的例子)。 您也可以刚刚传递指针,但这意味着更改您的界面。
这适用于我的机器:
#include <iostream>
#include <functional>
#include <memory>
template< class T >
struct rvalue_reference_wrapper
{
rvalue_reference_wrapper( T&& t )
: t_(std::move(t))
{}
operator T&&() const volatile
{
return std::move(t_);
}
private:
T&& t_;
};
template< class T >
rvalue_reference_wrapper<T> rvalue_ref( T&& t )
{
return rvalue_reference_wrapper<T>(std::move(t));
}
void go( std::unique_ptr<int> i )
{
std::cout << *i << std::endl;
}
int main()
{
std::unique_ptr<int> i(new int(1));
auto b = std::bind( go, rvalue_ref(std::move(i)) );
//auto b = std::bind( go, std::ref(std::move(i)) ); // Wont work
b();
}
我没有使代码具有防弹性,但欢迎讨论rvalue_reference_wrapper的需要,或者如何使用std :: reference_wrapper来模拟它。
此外,对于您的特定情况,您可能需要编写rvalue_reference_wrapper的差异版本,该值通过值而非rvalue引用保存对象,因为您的原始unique_ptr可能会因为您使用异步而离开作用域(并被销毁) asio电话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.