我想知道如何将分配器绑定到我的自定义令牌,并在令牌的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
令牌的路径。
2条答案
按热度按时间qc6wkl3g1#
作为一个介绍,
bind_allocator
和完成令牌的内部分配器有不同的用途,我想如果我首先从表面上解决您帖子中的问题,情况会变得更清楚:1.* 我想知道如何将分配器绑定到我的自定义令牌[...]*
在我看来,
bind_allocator
已经满足了您的要求: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"。
zpgglvta2#
要将分配器绑定到自定义令牌并在令牌的async_result实现中使用它,需要将分配器传递给令牌构造函数并将其存储在令牌中,然后在创建async_result对象时,可以将存储的分配器传递给initiate函数。