为什么不是标准的C ++ 03接口来查询C ++ 0x中使用的分配器的成员类型?成员类型不足的用例是什么?
答案 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容器将从新需求中受益,而无需更改代码。