Вы можете просто использовать кастинг в стиле C.Нет необходимости в каких-либо «взломах» или «реализациях».Включение в явную функцию служит тому, что "C-Style бросает плохо" людей
template<typename Targ, typename Src>
typename boost::enable_if<boost::is_base_of<Targ, Src>, Targ>::type &
private_cast(Src &src) { return (Targ&)src; }
Чтобы иметь безопасный бросок, вам нужно убедиться, что Targ
на самом деле является частной или общедоступной базой.Это сделано boost::is_base_of
.
Конечно, вы должны предпочесть функции-члены в соответствующем производном классе, которые возвращают базовый указатель, вместо того, чтобы выполнять такое приведение. .
Определение оператора публичного приведения не работает.
Это не имеет смысла для меня ... Зачем вообще делать личный базовый класс?Просто сделайте это публичным.Причина, по которой ваши функции преобразования не работают, заключается в том, что Стандарт требует, чтобы неявные преобразования никогда не рассматривали функции преобразования в базовый класс, сам класс или void
.