Я пытаюсь найти способ принудительно заключить договор между базовым классом CRTP и производным. При использовании динамического полиморфизма можно просто сделать:
struct foo{
virtual bar() = 0;
};
И компилятор позаботится о том, чтобы метод bar
был реализован в производном классе, в противном случае он выдаст (более или менее) значимое сообщение об ошибке. Теперь лучшее, что я мог получить с помощью CRTP - это что-то вроде этого:
template<class Derived>
struct base {
void stuff(){
static_cast<Derived &>(*this).baz();
}
};
Который каким-то образом обеспечит реализацию baz
в производном классе, но на самом деле не читается и не ясно, каков контракт между базовым и производным классом. Итак, мой вопрос, есть ли способ сделать это лучше? Я знаю о C ++ 20 Concepts и что они были бы идеальным решением для этого случая, но я ищу C ++ 11 / C ++ 14 решение, чтобы сделать его максимально чистым.