我创建了一个问题(switching to another different custom allocator -> propagate to member fields),发现在每个提出的解决方案中,我必须手动将分配器传播到每个成员字段。
例如,如果用户要复制C
的实例,但又希望新实例使用不同分配器,则最好的方法之一是:-< / p>
class C{
ContainerLikeClass1 b1; //: is a container type
ContainerLikeClass2 b2; //: is a container type
PlainOldDataLike b3; //: not a container type
C(const C& other, const allocator_type & alloc){ //#1
b1=ContainerLikeClass1(other.b1,alloc); //<-- manually hard code
b2=ContainerLikeClass2(other.b2,alloc); //<-- manually hard code
b3=other.b3; //<-- manually hard code
}
}
上述功能不会像copy constructor
,move constructor
,copy assignment operator
和move assignment operator
那样自动生成。
(^也可以从an answer中Using custom allocator for AllocatorAwareContainer data members of a class看到该模式。)
请注意,如果字段很多(b1
,b2
,b3
)会很不方便。
如果我错过其中之一,则可能是一个错误。
most-voted answer there(JaMiT's)建议,如果我真的想要简单的方法,可以调用默认函数(如下)。
//modified by me a little
C(const C& c, const allocator_type & alloc) : C(c) {
//#2
b1=ContainerLikeClass1(other.b1,alloc); //<-- manually hard code
b2=ContainerLikeClass2(other.b2,alloc); //<-- manually hard code
//b3=other.b3; //<-- no need
}
// also add C's default copy constructor = default
但是,有两个缺点:1.副本2产生了额外费用。它仍然没有完全自动生成。
为什么C ++不提供默认的“ copy-plus-allocator”? (例如#1
)
围绕着分配器的编码必须繁琐且难以维护吗?
是“分配器”只是(太)很少使用(或实验性)的功能,因此相对而言不值得多加注意吗?
我想念什么? //<-- I believe this is the most correct question.
我是C ++分配器的新手。