如何在C ++中重新绑定有状态的分配器?

问题描述

假设不希望有一个状态分配器并创建一个副本,我认为必须通过引用(提供给任何给定的struct或class)来提供它,所以:

element_allocator_type &allocator = supplied_allocator;

一个人如何将这个分配器引用重新绑定到另一种类型而又不失去其有状态性,即。没有创建副本?实际上我们可以这样做吗?如果:

typedef typename std::allocator_traits<element_allocator_type>::template rebind_alloc<unsigned char> uchar_allocator_type;

(例如)是我们重新绑定到的类型,创建重新绑定的分配器引用的行是什么?

uchar_allocator_type &rebound_allocator = ???

干杯-

解决方法

假设必须通过引用(给定的任何结构或类)提供有状态的分配器

好,你有问题。 C ++标准库分配器模型不需要这样的东西。分配器类型为required to be copyable,甚至是有状态的类型。期望分配器的副本将像原始分配器一样工作,并且一个分配器的副本可以由另一个分配器释放(这是==应用于两个分配器时的意思)。

简而言之,如果您的分配器是有状态的,则它必须提供浅层复制行为。这就是实现rebind的方式:新的分配器可能具有不同的分配类型,但是它引用相同的分配机制。