Considérez le modèle de modèle récurrent curieux, pouvez-vous empêcher le code non sécurisé suivant de compiler?
template <class Derived>
class Base {
public:
void foo()
{
// faire quelque chose en supposant que "this" est de type Derived :
static_cast<Derived*>(this)->bar();
}
};
// C'est OK
class A: public Base<A>
{
public:
void bar()
{
// ...
}
};
// Crash and burn, should be prevented by the compiler
class B: public Base<A>
{
//...
};
void f()
{
// comportement indéfini : objet B a été static_cast en A
B{}.foo();
}
Y a-t-il un moyen d'ajouter une sorte de restriction à la classe Base
pour empêcher la définition de class B
d'être valide?