C++ 0x permitirá que la plantilla tome un número arbitrario de argumentos. ¿Cuál es el mejor uso de esta función aparte de implementar tuplas?Plantillas variables
Respuesta
- de tipo seguro printf
- Transmisión de arbitrarias muchos argumentos de constructor en métodos de fábrica
- Tener arbitrario clases base permite poner y eliminar políticas útiles.
- Inicializando moviendo objetos de tipo heterogéneo directamente en un contenedor con un constructor de plantilla variado.
- Tener un operador literal que puede calcular un valor para un literal definido por el usuario (como "10110b").
Muestra a 3:
template<typename... T> struct flexible : T... { flexible(): T()... { } };
Muestra a 4:
struct my_container { template<typename... T> my_container(T&&... t) { } };
my_container c = { a, b, c };
Muestra a 5:
template<char... digits>
int operator "" b() { return convert<digits...>::value; }
ver este código de ejemplo: here
- de tipo seguro
printf
Sí, pero aún tengo que ver una implementación muy elegante de eso :-) –
I thi nk este ejemplo específico es algo así como un caso degenerado. Recuerde que para cada instanciación, el compilador necesita crear más código. ¿Te imaginas crear más de 100 versiones de printf por cada posible combinación de argumentos utilizada? Oh el infierno! – shoosh
@Shy: no si todas las versiones son envolturas en línea para la impresión * real *. – CesarB
Permitir cosas como Boost.Function a tomar un número arbitrario de parámetros
Acabo de escribir un article sobre cómo implementar múltiples interfaces COM y mantener su código compacto y elegante con las plantillas variables de C++ 0x.
Escriba la seguridad de cada llamada con número de argumento dinámico.
¿Podría ser más preciso? – alestanis
He implementado un NDArray (matriz N-dimensional) y tiene el método setSizes con varios recuentos de argumentos. Usar argumentos de plantilla variadic es más seguro que usar argumentos de funciones variadic, además puedo controlar el recuento de parámetros pasados a esta función en tiempo de compilación solo con argumentos de plantillas variadic.
void setSizes(uintmax_t currentSize) {
static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
}
template <typename... Sizes>
void setSizes(uintmax_t currentSize, Sizes... sizes) {
static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
for (uintmax_t i = 0; i < currentSize; i++) {
data_[i]->setSizes(sizes...);
}
}
También he implementado un envoltorio de constructor universal para mi SmartPointer hecho a sí mismo. Se ajusta a todo constructor definido por el usuario del tipo de puntero sin formato.
template <typename TSmartPointer, typename... Args>
static inline void initialize(TSmartPointer *smartPointer, Args... args) {
smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
smartPointer->__retain();
}
Este código parece ser inobvious, esto es una parte de la inicialización de la SmartPointer para el caso si SmartPointer debe llamar automáticamente al constructor del puntero en la adquisición de la SmartPointer (RAII). En el caso de las clases abstractas, no puede llamar al constructor.
Por lo tanto, si tengo una AbstractObject tipo, que es SmartPointer de una clase abstracta, y el tipo ConcreteObject, que es SmartPointer de la clase con el constructor que toma dos enteros, puedo escribir código siguiente:
AbstractObject object = ConcreteObject(42, 42);
es como C# y Java (pero con RAII) y funciona para mí en C++/GCC 4,8 =)
La impresión segura de tipos se ha mencionado en otras respuestas, pero en general se pueden usar plantillas variadas para implementar funciones de formateo que no requieren pasar información de tipo a través de especificadores de formato. Por ejemplo, los C++ Format library implementos formatear funciones similares a Python de str.format:
fmt::print("I'd rather be {1} than {0}.", "right", "happy");
además de printf seguro. Los tipos de argumentos se capturan automáticamente utilizando plantillas variadic en C++ 11.
Esto hace especificadores printf como lld
o notoria PRIdPTR
innecesaria y en lugar de
std::printf("Local number: %" PRIdPTR "\n\n", someIntPtr);
uno puede simplemente utilizar
fmt::printf("Local number: %d\n\n", someIntPtr);
Negación: Soy el autor de esta biblioteca
- 1. XSL: pasar variables entre plantillas
- 2. Variables Django settings.py en plantillas
- 3. Plantillas variables sin los parámetros de función
- 4. Plantillas variables y rasgos de tipo
- 5. de plantillas C++ Clase constructor con argumentos variables
- 6. Manipulación 'cadena' en tiempo de compilación con plantillas variables
- 7. cómo pasar variables entre las plantillas de jade
- 8. Plantillas variables: iterar sobre el argumento de tipo/plantilla
- 9. Plantillas de Ruby: ¿cómo pasar variables a ERB en línea?
- 10. Uso de variables aumentadas/disminuidas en las plantillas de django
- 11. Cómo pasar variables entre dos plantillas en XSLT
- 12. funciones de plantillas de C++ con argumentos variables
- 13. Plantillas de Django: insertar valores para las variables de JavaScript
- 14. Detectando variables no definidas en las plantillas de Django
- 15. Plantillas variables, reenvío perfecto a funciones con argumentos predeterminados
- 16. Rieles con plantillas Underscore.js
- 17. ¿Se pueden usar plantillas para acceder a las variables de estructura por nombre?
- 18. Cómo obtener la lista de todas las variables en las plantillas de jinja 2
- 19. ¿Cómo los controladores Play insertan variables con el nombre propio en las plantillas?
- 20. plantillas: variables miembro de la clase padre no visibles en la clase
- 21. Django - expirará caché de plantillas de Django en función de variables
- 22. Pasando variables para modelar métodos de instancia en plantillas de Liquid
- 23. Atlassian JIRA Plugin Development: cómo hacer que las variables estén disponibles para las plantillas de velocidad
- 24. Usar las variables de vista de Django dentro de las plantillas
- 25. knockoutjs 1.3PRE "Este motor de plantillas no admite plantillas anónimas anidadas en sus plantillas"
- 26. Plantillas de correo electrónico como plantillas de scala en Play?
- 27. Plantillas C++: Especificaciones parciales de plantillas y clases de amigos
- 28. variables de Jquery variables
- 29. ¿Java admite variables variables?
- 30. Bash - variables variables
no solo impresión segura de tipos, sino funciones variadas seguras de tipo? –