Взгляните на следующий простой шаблон любопытного повторяющегося шаблона (CRTP):
template<class Derived>
struct base
{
void foo() {
static_cast<Derived*>(this)->foo();
}
};
struct derived
: public base<derived>
{};
Поскольку derived
не имеет функции-члена foo
, кроме функции, полученной из base
, вызов derived{}.foo()
дает бесконечную рекурсию. Можем ли мы изменить определение base::foo
таким образом, чтобы static_cast<Derived*>(this)->foo()
вызывалось только при наличии Derived::foo
?
EDIT : причина, по которой я спрашиваю, заключается в том, что foo
в моем реальном приложении есть аргумент шаблона. А поскольку шаблонный метод не может быть виртуальным, CRTP представляется единственным обходным решением.