2015-03-27 6 views
5

Stavo riflettendo sulle possibili implementazioni di std::tuple (e su qualsiasi classe di template simile con un numero variabile di "membri" definiti in fase di compilazione) e ho pensato che forse si potrebbe creare un "tipo ricorsivo" simile a un elenco collegato. Ho provato a compilare il seguente test-case:Creazione di una "lista concatenata" compilata in tuple con modelli variadici

template <typename FirstType, typename... OtherTypes> 
class TupleLite 
{ 
    public: 
    FirstType type_; 
    TupleLite<OtherTypes...> other_types_; 
}; 

int main() 
{ 
    TupleLite<int,double> mytuple; 
} 

la classe stessa compila senza errori, ma l'istanza genera l'errore wrong number of template arguments (0, should be 1 or more). Credo che questo sia dovuto al fatto che TupleLite<int, double> tenta di creare un'istanza di TupleLite<double>, che tenta di creare un'istanza di TupleLite<>, per la quale non esiste una definizione valida.

Questa "classe di dimensioni ricorsive" può essere recuperata? Ho provato a definire il "senza argomenti di specializzazione" di TupleLite come segue:

template <> 
class TupleLite {} 

.... ma questo non sembra funzionare, anche se g++ e clang++ sembrano in disaccordo su esattamente perché.

Da g++, gli errori più importanti sembrano essere:

error: template specifiers not specified in declaration of ‘template<class FirstType, class ... OtherTypes> class TupleLite’ 
    class TupleLite 
     ^
error: wrong number of template arguments (0, should be 1 or more) 
TupleLite<OtherTypes...> other_types_; 
         ^

clang++, comunque, dice:

error: extraneous 'template<>' in declaration of class 'TupleLite' 
template <> 
^ 
error: redefinition of 'TupleLite' as different kind of symbol 
class TupleLite 
    ^
+1

Avete sentito parlare di ['TypeList'] (http://loki-lib.sourceforge.net/html/a00681.html)? –

+0

@RSahu No, non l'avevo. –

+0

... Ma '' template <> class TupleLite {} '' è C++ 11 valido? – Cinch

risposta

3

La definizione del modello primario di TupleLite specifica che richiede almeno un argomento template , FirstType. Dal momento che non è quello che si vuole esprimere è, di fornire un defition primario modello che finisce per gestire anche il caso vuoto come questo:

template <typename...> 
class TupleLite{}; 

E uno specializzazioni parziali:

template <typename FirstType, typename... OtherTypes> 
class TupleLite<FirstType, OtherTypes...> 
{ 
    public: 
    FirstType type_; 
    TupleLite<OtherTypes...> other_types_; 
}; 

Coliru Demo.

MODIFICA: Grazie a Nikos per aver sottolineato che la specifica vuota non era necessaria in questo caso.

+1

Non hai bisogno della specializzazione args vuota. Basta definire il modello di base: [demo] (http://coliru.stacked-crooked.com/a/db65288a2503dfa8) –

+0

@NikosAthanasiou Ah sì. Grazie! Modificato. – Pradhan

+0

Ah, è abbastanza sensato. Grazie. –