È possibile farlo nel C++ corrente. Si dà il modello di un numero "abbastanza grande" dei parametri, e si dà loro valori predefiniti:
class nothing1 {};
class nothing2 {};
class nothing3 {};
template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};
Oppure si può ottenere più sofisticati e l'uso ricorsione. Per prima cosa è andata-dichiara il modello:
class nothing {};
template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;
Poi si specializzano per il caso in cui tutti i parametri sono di default:
template <>
class X<nothing, nothing, nothing> {};
Poi si definiscono correttamente il modello generale (che in precedenza hai solo in avanti -declarato):
template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>
Nota come nella classe base si eredita X ma si perde il primo parametro. Quindi scivolano tutti insieme in un punto. Alla fine saranno tutti predefiniti, e la specializzazione prenderà il via, che non erediterà nulla, chiudendo così la ricorsione.
Aggiornamento: appena avuto una strana sensazione che avevo postato qualcosa di simile prima, and guess what...
fonte
2009-10-02 20:06:43
si potrebbe anche utilizzare un solo "nulla" classe – sellibitze
@sellibitze - io uso utilizzare un solo "niente" di classe nella versione ricorsiva. Non è possibile utilizzare la stessa classe per i valori predefiniti nella versione non ricorsiva, poiché si otterranno errori "nulla è già una classe di base diretta". –
Non capisco: perché salti il primo parametro quando erediti da X? – Gili