Supponiamo di avere una tupla e di voler generare una nuova tupla applicando una metafunzione su ciascun tipo della prima. Qual'è la metafunzione C++ più efficiente da eseguire in questo compito? È anche possibile utilizzare il modello variadico C++ 0x per fornire un'implementazione migliore?Generazione di tuple da tuple
5
A
risposta
8
Come 'bout questo:
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;
};
Poi
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;
che sta utilizzando una classe metafunction avvolgendo il apply
in un non-modello. Ciò consente di passarlo a modelli C++ 03 (che non possono accettare modelli con parametri arbitrari semplicemente facendo template<typename...> class X
). Si può, ovviamente, accettare un metafunction puro (non una classe) troppo
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;
};
e utilizzare il std::add_pointer
modello
typedef mod<std::add_pointer, tuple_foo>::type tuple_ptrfoo;
Oppure si può avvolgerlo in una classe in modo che sia compatibile con il primo versione
// 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;
Spero che sia d'aiuto.
+0
Cool litb (awgn). –
Problemi correlati
- 1. Converti tuple-stringhe a tuple di stringhe
- 2. Riorganizza tuple di tuple in Python
- 3. Conversione tra std :: tuple e boost :: tuple
- 4. List + = Tuple vs List = Lista + Tuple
- 5. Scala diviso stringa da tuple
- 6. Convertire l'elenco di tuple da elencare?
- 7. Aggiungi tuple alla lista di tuple in Python
- 8. Aggiungere un'altra tuple ad una tupla di tuple
- 9. estratto secondo elemento tuple nella lista di tuple
- 10. Controllare se l'elemento esiste in tuple di tuple
- 11. Elenco filtri di tuple
- 12. Transform tuple di DICT
- 13. definizione di metodi tuple
- 14. medio di tuple
- 15. Raggruppamento Python lista tuple
- 16. Perché GHC stampa 15-tuple ma non 16-tuple?
- 17. Internals per tuple di pitone
- 18. NumPy - Conversione efficiente da tuple a array?
- 19. Elenco tuple da dict in Python
- 20. Ottieni tuple uniche da List, Python
- 21. Posso creare tuple da IEnumerables usando Linq?
- 22. “sostituire” un 3-tuple
- 23. Da tuple a più colonne in panda
- 24. valore Tuple a chiave
- 25. tuple vettoriale e initializer_list
- 26. python tuple a dict
- 27. tuple e l'assegnazione stranezza
- 28. tuple Concatena in elisir
- 29. Tuple multiple in unique_together
- 30. Errore tuple annidato vuoto
Boost.MPL può essere di interesse, ha una meta-funzione 'transform'. – GManNickG