Cómo implementar una verificación en tiempo de compilación de que un downcast es válido en un CRTP?

Tengo un CRPT viejo y simple (no se distraiga con las restricciones de acceso; la pregunta no es sobre ellos):

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

que, como de costumbre, está destinado a usarse así:

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

Ahora esostatic_cast me molesta. Necesito un downcast (no un upcast), así que tengo que usar un reparto explícito. En todos los casos razonables, la conversión será válida ya que el objeto actual es de la clase derivada.

¿Pero qué pasa si de alguna manera cambio la jerarquía y el elenco ahora no es válido?

¿Puedo de alguna manera hacer cumplir una verificación en tiempo de compilación de que un downcast explícito es válido en este caso?

Respuestas a la pregunta(5)

Su respuesta a la pregunta