2009-09-24 14 views
26

Sto provando a digitare sia unordered_map o std :: map a seconda che ci siano librerie TR1 disponibili. Ma non voglio specificare i parametri del modello. Da quanto ho letto finora, i typedef'ing template senza argomenti non sono possibili finché non è disponibile lo standard ufficiale C++ 0x. Qualcuno sa quindi una soluzione elegante per questo?Typedef una classe template senza specificare i parametri del modello

#ifdef _TR1 
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments 
#else 
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments 
#endif 
+0

Vedi questa domanda molto vicina: http://stackoverflow.com/questions/544842/c-typedef-ing-stl e le risposte fornite. I typedef dei template non sono validi Comandi C++ –

+1

Benoit - Grazie, è esattamente quello che stavo cercando –

+0

Domanda molto simile: http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class Ha un altro risposta che non è menzionata qui: "modello alias" in C++ 11 – Jayesh

risposta

36

Il modo in cui ho visto questo fatto è quello di avvolgere il typedef in un modello-struct:

template<typename KeyType, typename MappedType> 
struct myMap 
{ 
#ifdef _TR1 
    typedef std::tr1::unordered_map<KeyType, MappedType> type; 
#else 
    typedef std::map<KeyType, MappedType> type; 
#endif 
}; 

Poi nel codice si richiama in questo modo:

myMap<key, value>::type myMapInstance; 

Può essere un po 'più prolisso di quello che vuoi, ma credo che soddisfi il bisogno dato lo stato attuale del C++.

+3

È davvero il solito modo di simulare la mancanza di typedef template in C++. Tuttavia, avrei chiamato il typedef "type" invece di "value", sembra più corretto semanticamente parlando ed è più idiomatico. Codice –

+1

aggiornato, grazie – fbrereto

4

È necessario utilizzare i tipi completi per typedef.

Utilizzare invece una macro #define.

+1

A volte è meglio ricorrere ai vecchi metodi. Programmazione del nastro condotto al suo meglio. –

+4

purtroppo le macro non rispettano l'ambito. – sellibitze

Problemi correlati