2010-01-13 14 views
7

Stavo cercando di risolvere un problema, ma ho trovato una soluzione diversa. tuttavia per curiosità, come per sapere se ciò che segue è possibile:Modello specializzato C++ ereditato dalla versione non specializzata

template<class> struct S; 
template< > struct S<Foo> : struct<Foo> {}; 

Vorrei essere in grado di ereditare struct non specializzato da specializzata struct.the esempio di cui sopra non funziona perché la struct ereditato è il specializzata, leader alla ricorsione infinita.

Una soluzione possibile era quella di aggiungere il parametro secondo modello, dire bool specializzato, in modo tale che il valore predefinito è falso, e il modello specializzato ha quel parametro è true.however che rende le cose un po 'confuso in quanto esemplificazione deve specificare parametro aggiuntivo.

C'è un altro modo per implementare quanto sopra?

il problema originale era quello di implementare la matrice di matrici, in cui la matrice stessa può avere operatori aggiuntivi, a seconda che le matrici costituenti abbiano quegli operatori. Mi auguro che abbia senso. allo stesso tempo, diverse matrici specializzate devono essere della stessa classe base mantenendo allo stesso tempo lo stesso nome, anche se con parametri di template diversi. Ho pensato che ci fosse un modo per farlo usando enable_if e digitare i tratti

+3

La prima contro-domanda è che tipo di problema stai cercando di risolvere con questo? –

risposta

2

Una possibile soluzione era aggiungere un secondo parametro di modello, ad esempio bool specializzato, in modo che il valore predefinito sia falso e che il modello specializzato abbia quel parametro true.however che rende le cose un po 'confuse dal momento che l'istanziazione deve specificare parametri aggiuntivi.

È possibile eseguire template<class Foo, bool flag = false>, quindi il secondo parametro è facoltativo.

5

Si potrebbe mantenere tutte le cose generica in un tipo distinto, ed estendere che con la vostra specializzazione:

template <typename> struct S_generic { /* generic stuff here */ }; 

template <typename T> struct S : public S_generic<T> { /* nothing here */ }; 
template <> struct S<Foo> : public S_generic<Foo> { /* extra stuff here */ }; 

Edit: In alternativa, se non ti piace il nome in più, il modo di utilizzare un flag extra senza problemi durante l'istanziazione del modello è di utilizzare un valore predefinito:

template <typename T, bool fully_defined=true> struct S; 
template <typename T> struct S<T,false> { /* generic stuff here */ }; 

template <typename T> struct S<T,true> : public S<T,false> {}; 
template <> struct S<Foo,true> : public S<Foo,false> { /* extra stuff here */ }; 
+0

questo è quello che ho finito per fare. quello che stavo cercando di evitare è avere due nomi diversi. Penso che ci potrebbe essere un modo per farlo usando enable_if e digitare i tratti. – Anycorn

+0

Non vi è alcun motivo per aggiungere tutte le complicazioni extra di tratti enable_if o type, basta utilizzare una base comune che può essere ereditata da non specializzata e specializzata. 'BlahBase' o' blah_base' sono comuni. –

+0

a questo punto non è tanto la questione pratica, quanto la questione della curiosità, "mi chiedo se può farlo?". – Anycorn

Problemi correlati