Я пытаюсь реализовать полиморфизм времени компиляции с использованием CRTP и хочу заставить производный класс реализовать эту функцию.Является ли эмуляция чистой виртуальной функции в статическом полиморфизме с использованием CRTP?
Текущая реализация такова.
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->f();
}
};
struct derived : base<derived>
{
void f() {
...
}
};
В этом варианте осуществления, вызов функции попадает в бесконечный цикл, если производный класс не выполнил f()
.
Как заставить производный класс реализовать функцию как чистую виртуальную функцию? Я попытался использовать «static_assert», например, static_assert(&base::f != &Derived::f, "...")
, но он генерирует сообщение об ошибке, в котором указано, что два указателя функции-члена, указывающие на функции-члены разных классов, не сопоставимы.
Посмотрите на 'ctype :: scan_is' и' ctype :: do_scan_is'. – Mehrdad