Supongamos que tiene una tupla y desea generar una nueva tupla aplicando una metafunción en cada tipo de la primera. ¿Cuál es la metafunción de C++ más eficiente para lograr en esta tarea? ¿También es posible utilizar la plantilla variady C++ 0x para proporcionar una mejor implementación?Generando tuplas de tuplas
5
A
Respuesta
8
¿Qué tal éste:
template<typename Metafun, typename Tuple>
struct mod;
// using a meta-function class
template<typename Metafun, template<typename...> class Tuple, typename ...Types>
struct mod<Metafun, Tuple<Types...>> {
typedef Tuple<typename Metafun::template apply<Types>::type...>
type;
};
Entonces
typedef std::tuple<int, bool> tuple_foo;
struct add_pointer {
template<typename T>
struct apply { typedef T *type; };
};
typedef mod<add_pointer, tuple_foo>::type tuple_ptrfoo;
Eso está utilizando una clase metafunción envolviendo la apply
en un no-plantilla. Eso permite pasarlo a plantillas C++ 03 (que no pueden aceptar plantillas con parámetros arbitrarios simplemente haciendo template<typename...> class X
). Es posible, por supuesto, aceptar una metafunción puro (no una clase) también
template<template<typename...> class Metafun, typename Tuple>
struct mod;
// using a meta-function
template<template<typename...> class Metafun, template<typename...> class Tuple,
typename ...Types>
struct mod<Metafun, Tuple<Types...>> {
typedef Tuple<typename Metafun<Types>::type...>
type;
};
Y el uso de la plantilla std::add_pointer
typedef mod<std::add_pointer, tuple_foo>::type tuple_ptrfoo;
O se puede envolver en una clase por lo que es compatible con la primera versión
// transforming a meta function into a meta function class
template<template<typename...> class Metafun>
struct ToClass {
template<typename ... T>
struct apply { typedef Metafun<T...> type; };
};
typedef mod<ToClass<std::add_pointer>, tuple_foo>::type tuple_ptrfoo;
Espero que ayude.
+0
Cool litb (awgn). –
Cuestiones relacionadas
- 1. Agrupación Python tuplas lista de tuplas
- 2. C++ 0x: ¿se permiten tuplas de tuplas?
- 3. Manipulando tuplas
- 4. Python: conversión de lista de listas a tuplas de tuplas
- 5. concatenación de tuplas
- 6. Máximo de dos tuplas
- 7. Ordenando tuplas en F #
- 8. Ordenar Tuplas Python
- 9. Expandir tuplas en argumentos
- 10. ¿Cómo añadir tuplas con
- 11. Creando tuplas autorreferenciadas
- 12. tuplas vs registros
- 13. extracción de elementos de tuplas
- 14. Lista de filtrado de tuplas
- 15. Trabajar con tuplas de Scala
- 16. Error de tuplas anidadas vacías
- 17. Newbie Python Pregunta sobre tuplas
- 18. anexar tuplas a una lista
- 19. F # constructor no acepta tuplas?
- 20. Cómo invertir tuplas en Python?
- 21. Agregar tuplas a las listas
- 22. Lista de tuplas de dict en Python
- 23. Haskell lista de lista de tuplas
- 24. pitón: lista de tuplas de listas
- 25. Haskell clase de tipos de tuplas
- 26. Python - lista de tuplas de función/argumento
- 27. Administrar colecciones de tuplas en Objective-C
- 28. tuplas de Python como teclas lentas?
- 29. Aserciones de prueba para tuplas con flotadores
- 30. ¿Cómo clasifica Python una lista de tuplas?
Boost.MPL puede ser de interés, tiene una metafunción 'transformar'. – GManNickG