Próbuję wprowadzić polimorfizm czasu kompilacji za pomocą protokołu CRTP i chcę wymusić na klasie pochodnej implementację tej funkcji.Czy emulacja czystej funkcji wirtualnej w statycznym polimorfizmie za pomocą CRTP jest możliwa?
Obecna realizacja wygląda następująco.
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->f();
}
};
struct derived : base<derived>
{
void f() {
...
}
};
W tej implementacji, wywołanie funkcji wpada w nieskończoną pętlę jeśli klasa pochodna nie wdrożył f()
.
Jak wymusić wyprowadzoną klasę, aby zaimplementowała funkcję podobną do czystej funkcji wirtualnej? Próbowałem użyć "static_assert", jak static_assert(&base::f != &Derived::f, "...")
, ale generuje on komunikat o błędzie informujący, że dwa wskaźniki funkcji członków wskazujące funkcje członków różnych klas nie są porównywalne.
Spójrz na 'ctype :: scan_is' i' ctype :: do_scan_is'. – Mehrdad