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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top