Как мы знаем в CRTP наследуемую базу производного класса, в качестве окончательного наследования.
Что если мы хотим сделать производный класс не финальным, а переопределяющие функции - 'финальными'?
Есть ли способ сделать это с помощью static_assert?
Пример кода:
template <typename D>
struct A
{
int f()
{
return static_cast<D*>(this)->g();
}
int g();
};
struct B : A<B> // usually final, but we want it inheritable
{
int g() // but this should be 'final'
{
// TODO: ???
return 1;
}
};
struct C : B
{
int g() // this is bad
{
return 2;
}
int h(); // this is permissive
};
#include <iostream>
template <typename D>
void f(A<D>& x)
{
std::cout << x.f() << std::endl;
}
int main()
{
B b;
C c;
f(b); // OK, it's 1
f(c); // BAD, it's 1
return 0;
}