Как реализовать во время компиляции проверку допустимости понижающего преобразования в CRTP?

У меня старый добрый CRPT (пожалуйста, не не отвлекаться на ограничения доступа - вопрос не в них):

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

, как обычно, предназначен для использования вот так:

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

Теперь, когда static_cast меня беспокоит. Мне нужен понижающий (не повышающий), поэтому я должен использовать явное приведение. Во всех разумных случаях приведение будет действительным, поскольку текущий объект действительно относится к производному классу.

Но что, если я каким-то образом изменю иерархию, и приведение теперь станет недействительным?

Могу ли я каким-то образом принудительно выполнить проверку во время компиляции. что в этом случае допустимо явное понижающее преобразование?

8
задан sharptooth 6 May 2011 в 07:20
поделиться