У меня старый добрый 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
меня беспокоит. Мне нужен понижающий (не повышающий), поэтому я должен использовать явное приведение. Во всех разумных случаях приведение будет действительным, поскольку текущий объект действительно относится к производному классу.
Но что, если я каким-то образом изменю иерархию, и приведение теперь станет недействительным?
Могу ли я каким-то образом принудительно выполнить проверку во время компиляции. что в этом случае допустимо явное понижающее преобразование?