c++ 将分配器绑定到自定义令牌

p5cysglq  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(178)

我想知道如何将分配器绑定到我的自定义令牌,并在令牌的async_result实现中使用它?
如果我们以use_tuple为例,它似乎只能与自己的use_tuple.rebind(another_allocator)分配器一起工作,而不能与用户关联的分配器或调用异步函数的对象一起工作。
为了我自己未来的类型,我希望能够说

async_read(socket, buffer, bind_allocator(some_polymorphic_alloc, my::use_future));

在my_use_future的async_result<my::use_future_t, Signature>专门化中,我想使用绑定分配器,而在bind_allocator中,async_read函数使用该分配器进行分配,但是在async_result<>::initiate函数中,我看不到该分配器传递给my::use_future令牌的路径。

qc6wkl3g

qc6wkl3g1#

作为一个介绍,bind_allocator和完成令牌的内部分配器有不同的用途,我想如果我首先从表面上解决您帖子中的问题,情况会变得更清楚:
1.* 我想知道如何将分配器绑定到我的自定义令牌[...]*
在我看来,bind_allocator已经满足了您的要求:

    • 一个
auto h = [](boost::system::error_code, size_t) {};
asio::streambuf b(1024);

std::allocator<char>             a1;
pmr::polymorphic_allocator<char> a2{pmr::get_default_resource()};

async_read(s, b, h);
async_read(s, b, asio::bind_allocator(a1, h));
async_read(s, b, asio::bind_allocator(a2, h));
async_read(s, b, asio::use_future);
async_read(s, b, asio::bind_allocator(a1, asio::use_future));
async_read(s, b, asio::bind_allocator(a2, asio::use_future));

1.* [...]并在令牌的async_result实现中使用它?*
使用get_associated_allocator查询它。
1.* 但是我没有看到分配器在其async_result〈〉::initiate函数中传递给my::use_future标记的路径。*
这是因为它不是. bind_allocator(tok) returnsallocator_binder< typename decay< T >::type, Allocator >,这就是令牌类型,因此任何组合操作都将"看到"绑定的关联器类型,但在内部"看不到"令牌。

如何修复?

您需要的不仅仅是一个与分配器无关的完成令牌/处理程序相关联的分配器,而是需要一个支持分配器的完成令牌。
您可以像创建任何经典的支持分配器的类型一样创建它,例如标准库类型。
事实上,例如asio::use_future令牌类型实际上被定义为asio::use_future_t<std::allocator<void> >
因此,它是分配器感知的(async_result专门化可以响应所选的分配器类型),实现associated_allocator protocol以提供Handler semantics
我觉得associated_XXXX协议的灵感来自于未被充分使用的std::uses_allocator协议,我在这里用我自己的术语"协议"来表达,除了显式的trait类型之外,还有一个与trait的主模板一起工作的 * 约定 *。

附注

注意,分配器没有绑定执行器那么严格,后者对于程序的正确性至关重要。对于分配器,文档声明为_"Implementers can ignore the allocator, especially if the operation is not considered performance-sensitive"

zpgglvta

zpgglvta2#

要将分配器绑定到自定义令牌并在令牌的async_result实现中使用它,需要将分配器传递给令牌构造函数并将其存储在令牌中,然后在创建async_result对象时,可以将存储的分配器传递给initiate函数。

相关问题