Рассмотрим следующий стандартный пример CRTP:
#include <iostream>
template<class Derived>
struct Base {
void f() { static_cast<Derived *>(this)->f(); }
void g() { static_cast<Derived *>(this)->g(); }
};
struct Foo : public Base<Foo> {
void f() { std::cout << 42 << std::endl; }
};
int main() {
Foo foo;
foo.f(); // just OK
foo.g(); // this will Qaru and segfault
}
Если это было обычное виртуальное наследование, я мог бы пометить виртуальные методы f
и g
как чистые, как
struct Base {
virtual void f() = 0;
virtual void g() = 0;
};
и получить ошибку времени компиляции Foo
как абстрактную. Но CRTP не предлагает такой защиты. Могу ли я каким-то образом реализовать его? Также допустима проверка времени выполнения. Я подумал о сравнении указателя this->f
с static_cast<Derived *>(this)->f
, но не смог заставить его работать.