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
^
Avete sentito parlare di ['TypeList'] (http://loki-lib.sourceforge.net/html/a00681.html)? –
@RSahu No, non l'avevo. –
... Ma '' template <> class TupleLite {} '' è C++ 11 valido? – Cinch