在C ++ 0x中,allocator_traits <t>的目的是什么?</t>

时间:2010-12-21 18:36:48

标签: c++ c++11 traits allocator

为什么不是标准的C ++ 03接口来查询C ++ 0x中使用的分配器的成员类型?成员类型不足的用例是什么?

2 个答案:

答案 0 :(得分:7)

我不熟悉这类事情( at ),但this document似乎是了解allocator_traits背后理由的良好起点:

  

这个提案的基石是   allocator_traits的定义   包含类型和静态的模板   使用分配器的成员函数,   有效地取代了丢失的Allocator概念   法兰克福

答案 1 :(得分:6)

根据设计模式解释allocator_traits,它是一个Adapter来包装您的自定义分配器,它满足更少的实现要求(不需要构造,销毁,所有这些typedef ...)并将其转换为{ {3}}对象,使用静态成员和类型完成剩余的Allocator实现要求。

使用allocator_traits,您只需要为自定义分配器提供至少10行代码,例如open-std doc FlyWeight的第3页(提及@icecrime)。

我认为allocator_traits和allocator是将非FlyWeight对象转换为FlyWeight的一个很好的现实示例,以减轻实现细节的负担。它是一个很好的API设计实践,可以将一个类变成FlyWeight,它本应该是FlyWeight。

对于Java程序员,在设计模式方面,std :: allocator_traits就像包私有类CharacterDataLatin1,ChracterData00,CharacterData0E,01,02 ......继承自java.lang.CharacterData以提供静态Unicode定义和帮助程序将由Character(std :: allocator)类的每个实例共享。

修改: 通过allocator_traits间接调用自定义分配器的另一个好处是它保证了foward兼容性({3}}的第3页)。 Scoped Allocator Model的数量可能会在未来增长,即使您对分配器实施新要求一无所知,这些要求也已经存在于编译器制造商实施的allocator_traits中。知道C ++容器通过allocator_traits间接调用allocator,使用自定义分配器的STL容器将从新需求中受益,而无需更改代码。