Sto cercando di implementare il polimorfismo in fase di compilazione utilizzando CRTP e voglio forzare la classe derivata ad implementare la funzione.È possibile emulare la funzione virtuale pura nel polimorfismo statico utilizzando CRTP?
L'implementazione corrente è come questa.
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->f();
}
};
struct derived : base<derived>
{
void f() {
...
}
};
In questa implementazione, chiamata alla funzione cade in un ciclo infinito se la classe derivata non ha attuato f()
.
Come impongo alla classe derivata di implementare la funzione come pura funzione virtuale? Ho provato ad usare "static_assert" come static_assert(&base::f != &Derived::f, "...")
ma genera un messaggio di errore che dice che due puntatori funzione membro che puntano alle funzioni membro delle diverse classi non sono confrontabili.
Dai un'occhiata a 'ctype :: scan_is' e' ctype :: do_scan_is'. – Mehrdad