Ho la seguente classe di base template.Come forzare l'uso di modelli di template curiosamente ricorrenti in C++
template<typename T>
class Base {
public:
void do_something() {
}
};
Esso è destinato ad essere utilizzato come modello curiosamente ricorrenti modello. Dovrebbe essere ereditato come class B : public Base<B>
. È necessario non essere ereditato come class B : public Base<SomeoneElse>
. Voglio applicare staticamente questo requisito. Se qualcuno lo usa male, mi aspetto un errore nella fase di compilazione.
Quello che sto facendo è mettere un static_cast<T const&>(*this)
in do_something()
. In questo modo la classe che eredita il modello è o eredita dalla classe fornita come parametro del modello. Ci scusiamo per l'espressione confusa. In inglese semplice, richiede B
o eredita da SomeoneElse
in class B : public Base<SomeoneElse>
.
Non so se è il modo ottimale per raggiungere questo obiettivo. Mi sembra schifoso.
Tuttavia, voglio fare di più. Voglio assicurarmi che lo B
sia SomeoneElse
stesso. Come lo posso fare?
Il 'static_cast' non impone nulla; semplicemente provoca un comportamento indefinito se '* this' non è in realtà un' T'. –
@ T.C. Effettua controlli statici. Quello di cui stai parlando dovrebbe essere 'reinterpret_cast'. –
Controlla solo che 'T' è derivato da' Base ', non' * questo' è un 'T'. cioè, dato 'classe Bar: base pubblica {}; classe Foo: base pubblica {}; ', il tuo assegno non catturerà nulla. –