Domanda

È possibile utilizzare un modello modello di modello per catturare tutti i casi di un parametro modello che è essa stesso un modello?

Ho usato il modello per produrre output di debug per alcuni metodi basati su modelli. In primo luogo, ho creato un gestore generico, quindi specializzato per i tipi nativi:

template<typename... PARAMS> struct TypeList{};

template<typename TYPE> inline void ntype(ostream &out, TypeList<TYPE>) {
    out << typeid(TYPE).name();
}

template<> inline void ntype(ostream &out, TypeList<int>) {
    out << "int";
}

...

Quindi ho provato ad aggiungere un secondo formato modello per catturare i tipi di modelli:

template<typename ... SUB, template<typename...> class TYPE> void ntype(ostream &out, TypeList<TYPE<SUB...> >) {
    ntype(out, TypeList<typename TYPE>());
    out << '<';
    subtype(out, TypeList<SUB...>());
    out << '>';
}

Laddove il sottotipo è un metodo modello progettato per ricorrere all'elenco Parame, applicando a sua volta ciascuno a Ntype ().

Il problema è quando provo a chiamarlo con qualcosa all'effetto di:

ntype<SomeClass<int> >(out, TypeList<SomeClass<int> >());

Abbina solo la funzione generica del primo modello: nessun errore di compilation, ma non corrisponde mai alla versione modello modello. Sono sicuro che è semplicemente una mancanza di comprensione da parte mia, ma i risultati di Google sembrano molto sottili per terra quando si tratta di chiari esempi di modelli di modelli e ancora più sottili per quanto riguarda i parametri dei modelli variadici.

Qualcuno può spiegare se ciò che sto tentando è anche possibile e, in tal caso, cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Sembra che avessi semplicemente un errore di battitura - avevo aggiunto () dopo una delle mie tipliste in una dichiarazione di funzione, probabilmente dalla copia e incollavo da un'invocazione di funzione alle 3 del mattino, che stava causando la discrepanza.

Quindi, nel caso in cui qualcuno si stia chiedendo, sì, è possibile e quanto sopra è un modo perfettamente accettabile per farlo.

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