У меня есть старый добрый 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
. Мне нужно приведение вниз (а не приведение вверх), поэтому я должен использовать явное приведение. Во всех разумных случаях приведение будет действительным, поскольку текущий объект действительно принадлежит производному классу.
Но что, если я каким-то образом изменю иерархию, и приведение теперь станет недействительным?
Могу ли я каким-то образом обеспечить проверку во время компиляции, что в этом случае допустимо явное понижение?
Base
является производным от некоторого класса, который передается какDerived
, перед компиляцией ему также потребуется функция с именемMethodToOverride()
.... Все это звучит невероятно маловероятно. В любом случае, вы можете проверить boost.org/doc/libs/1_44_0/libs/type_traits/doc/html/ - person Tony Delroy   schedule 06.05.2011class Concrete : public Base<Other>
? Если это так, то выдает ошибку. Или может быть еще я не ясно. :) - person iammilind   schedule 06.05.2011