c++ - C++0x 中 allocator_traits<T> 的目的是什么?

标签 c++ c++11 traits allocator

为什么没有标准 C++03 接口(interface)用于查询 C++0x 中使用的分配器的成员类型?成员类型不足的用例有哪些?

最佳答案

为了从设计模式的角度解释 allocator_traits,它是 Adapter包装满足更少实现要求的自定义分配器(不需要构造,销毁,所有那些 typedef ...)并将其转换为 FlyWeight使用静态成员和类型为您完成分配器实现要求的其余部分的对象。

根据 open-std doc Scoped Allocator Model 的第 3 页,使用 allocator_traits,您只需为自定义分配器提供至少 10 行代码。 (感谢@icecrime 提及)。

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

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

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

关于c++ - C++0x 中 allocator_traits<T> 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4502691/

相关文章:

c++ - C++ 控制台中基于实时的递增/递减

c++ - 为什么在 reinterpet_cast 中使用数值?

c++ - clang 3.5 : Detecting a gobal function doesn't exist using SFINAE

c++ - 将赋值 move 到具有 const 值的对象

实现迭代器时出现 Rust 类型错误

c++ - 错误 : this statement may fall through [-Werror=implicit-fallthrough=]

c++ - volatile 成员变量

c++ - std::bind 可以在编译时进行类型检查吗?

generics - 使用静态分派(dispatch)返回特征类型

Java 8 扩展方法 - 为什么它们不称为 mixins 或 traits?