Typedef dei template: qual è il tuo problema?
-
09-06-2019 - |
Domanda
C++ 0x ha alias modello (a volte indicati come typedef modello).Vedere Qui.Le specifiche attuali di C++ no.
Cosa ti piace usare come soluzione?Oggetti contenitore o macro?Pensi che ne valga la pena?
Soluzione
Cosa ti piace usare come soluzione?Oggetti contenitore o macro?Pensi che ne valga la pena?
Il modo canonico è utilizzare una metafunzione come questa:
template <typename T>
struct my_string_map {
typedef std::map<std::string, T> type;
};
// Invoke:
my_string_map<int>::type my_str_int_map;
Questo viene utilizzato anche nell'STL (allocator::rebind<U>
) e in molte librerie tra cui Boost.Lo usiamo ampiamente in a biblioteca bioinformatica.
È gonfio, ma è la migliore alternativa il 99% delle volte.L'uso delle macro qui non vale i molti svantaggi.
(MODIFICARE:Ho modificato il codice per riflettere le convenzioni Boost/STL come sottolineato da Daniel nel suo commento.)
Altri suggerimenti
template <typename T> struct my_string_map : public std::map<std::string,T> { };
Non dovresti ereditare da classi che non hanno un distruttore virtuale.È correlato ai distruttori nelle classi derivate che non vengono chiamati quando dovrebbero essere e potresti ritrovarti con memoria non allocata.
Detto questo potresti *****probabilmente***** farla franca nell'istanza sopra perché non stai aggiungendo altri dati al tuo tipo derivato.Tieni presente che questa non è un'approvazione.Ti consiglio ancora non fallo.Il fatto che tu Potere farlo non significa te Dovrebbe.
MODIFICARE:Sì, questa è una risposta al post di ShaChris23.Probabilmente mi sono perso qualcosa perché è apparso sopra il suo messaggio invece che sotto.
A volte puoi semplicemente scrivere esplicitamente le typedef senza modello per tutti i tipi necessari.Se la classe base è modellata su più argomenti modello con un solo tipo che si desidera typedef, è possibile ereditare una classe specializzata con typedef effettivamente inclusa nel nome della classe ereditata.Questo approccio è meno astruso dell'approccio della metafunzione.