¿Por qué la interfaz C++ 03 no es estándar para consultar los tipos de miembro para asignadores utilizados en C++ 0x? ¿Cuáles son los casos de uso donde los tipos de miembros no son suficientes?¿Cuál es el propósito de allocator_traits <T> en C++ 0x?
Respuesta
No estoy familiarizado con este tipo de cosas ( en absoluto), pero this document parece ser un buen punto de partida para tener una idea sobre la razón de ser de allocator_traits
:
La clave de esta propuesta es la definición de un
allocator_traits
tipos de plantilla que contiene y funciones miembro estáticas para el uso de asignadores, sustituyendo eficazmente el conceptoAllocator
que se perdió en Frankfurt.
Para explicar allocator_traits en términos de patrón de diseño, su un Adapter para envolver su asignador personalizado que satisface los requerimientos mucho menos la aplicación (sin necesidad de construir, destruir, todas esas typedefs ...) y lo convierte en objeto FlyWeight eso completa el resto del requisito de implementación de Allocator para usted con miembros y tipos estáticos.
Con allocator_traits, solo necesita proporcionar un mínimo de 10 líneas de código para su asignador personalizado, según la página 3 del doc abierto Scoped Allocator Model (por ejemplo, a @icecrime).
Creo que allocator_traits y allocator son un buen ejemplo del mundo real de convertir objetos no FlyWeight en FlyWeight para aliviar la carga de los detalles de la implementación. Es una buena práctica de diseño de API para convertir una clase en FlyWeight que debería haber sido FlyWeight en primer lugar.
Para los programadores de Java, en términos de patrón de diseño, std :: allocator_traits es como las clases privadas de paquete CharacterDataLatin1, ChracterData00, CharacterData0E, 01, 02 ... que hereda de java.lang.CharacterData para proporcionar definición estática y ayudantes Unicode que deben ser compartidas por cada instancia de las clases Character (std :: allocator).
Editar: Otra ventaja de llamar indirectamente a través de su asignador de costumbre allocator_traits es que garantiza la compatibilidad foward (página 3 de Scoped Allocator Model). Número de requirements puede crecer en el futuro, e incluso si no sabe cómo implementar nuevos requisitos para su asignador, esos requisitos ya estarán allí en allocator_traits implementados por el fabricante del compilador. Sabiendo que los contenedores C++ llaman allocator indirectamente por allocator_traits, los contenedores STL que usan su asignador personalizado se beneficiarán de los nuevos requisitos sin la necesidad de que usted cambie su código.
- 1. por qué los contenedores asociativos no ordenados no usan allocator_traits <T> en C++ 0x
- 2. ¿Cuál es el propósito de :: en C#?
- 3. ¿Cuál es el propósito de ANYSIZE_ARRAY en <winnt.h>?
- 4. ¿Cuál es el destino de wchar_t en C++ 0x?
- 5. ¿Cuál es el propósito de typedefing una clase en C++?
- 6. ¿Cuál es el propósito de imbuir en C++?
- 7. ¿Cuál es el propósito de esta palabra clave en C#
- 8. ¿Cuál es el propósito de los Atributos en C#?
- 9. ¿Cuál es el propósito de "Container c = getContentPane();" en Swing?
- 10. ¿Cuál es el propósito de la directiva #define en C++?
- 11. ¿Cuál es el propósito de __cxa_pure_virtual?
- 12. ¿Cuál es el propósito de precompiledApp.config?
- 13. ¿Cuál es el propósito de 'var'?
- 14. ¿Cuál es el propósito del archivo vshost.exe?
- 15. ¿Cuál es el propósito del uso?
- 16. ¿Cuál es el propósito de config.assets.precompile?
- 17. ¿Cuál es el propósito de 'Class.forName ("MY_JDBC_DRIVER")'?
- 18. WPF: ¿Cuál es el propósito de App.xaml?
- 19. ¿Cuál es el propósito de `qt_noop`
- 20. ¿Cuál es el propósito de String.IsInterned?
- 21. ¿Cuál es el propósito de Rake?
- 22. ¿Cuál es el propósito de Function.const?
- 23. ¿Cuál es el propósito de layout.xml?
- 24. ¿Cuál es el propósito de requestWindowFeature()?
- 25. ¿Cuál es el propósito de IntentSender?
- 26. ¿Cuál es el propósito de utilizar NSOrderedSame?
- 27. ¿Cuál es el propósito de Mage_Core_Block_Template_Facade
- 28. ¿Cuál es el propósito de Membership.ValidateUser()
- 29. ¿Cuál es el propósito de Anorm's Pk?
- 30. ¿Cuál es el propósito de Active Records?
parece bastante tonto para hacer 'automático p = allocator_traits :: asignar (myalloc, n);' en lugar de ' automático p = myalloc.allocate (n);' ya que el primero es el tiempo llamando a este último. ¿Por qué agregaron la interfaz anterior en absoluto? –
@buratinas: a mi entender, para respaldar el [Modelo de adjudicador de alcance] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2554.pdf) – icecrime