Como implementar uma verificação em tempo de compilação de que um downcast é válido em um CRT

Eu tenho um CRPT antigo simples (por favor, não se distraia com restrições de acesso - a questão não é sobre eles):

 template<class Derived>
 class Base {
     void MethodToOverride()
     {
        // generic stuff here
     }
     void ProblematicMethod()
     {
         static_cast<Derived*>(this)->MethodToOverride();
     } 
 };

, como de costume, deve ser usado assim:

 class ConcreteDerived : public Base<ConcreteDerived> {
     void MethodToOverride()
     {
        //custom stuff here, then maybe
        Base::MethodToOverride();
     }
 };

Agora issostatic_cast me incomoda. Eu preciso de um downcast (não um upcast), então eu tenho que usar uma conversão explícita. Em todos os casos razoáveis, o elenco será válido, pois o objeto atual é realmente da classe derivad

Mas e se, de alguma forma, eu mudar a hierarquia e o elenco agora se tornar inválid

Posso, de alguma forma, impor uma verificação em tempo de compilação de que um downcast explícito é válido neste cas

questionAnswers(5)

yourAnswerToTheQuestion