Приведение указателей и тернарный оператор?:. Изобрел ли я колесо заново?

Последняя строка этого кода не может быть скомпилирована с помощью castingAndTernary.cpp: 15: error: условное выражение между разными типами указателей 'D1 *' и 'D2 *' не имеет преобразования

A действительно умный компилятор не может вызвать затруднений, потому что оба могут быть безопасно преобразованы в B * (базовый класс). Я не хочу использовать static_cast, dynamic_cast и т. Д. - меня беспокоит, что я Когда-нибудь перепутаю классы и получу неопределенное поведение. Вот почему я создал шаблон up_cast. Этот шаблон делает минимум разрешенных преобразований. Есть способ попроще? Есть и другие обходные пути, но я не могу не думать, что есть что-то еще более простое и безопасное, что я мог бы использовать?

struct B{ };
struct D1 : public B{ };
struct D2 : public B{ };

template<typename T,typename V>
T up_cast(V x) {
        return x;
}
int main() {
        bool boolean_expression = true;
        B * b;
        b = new D1;
        b = new D2;
        b = boolean_expression ? up_cast<B*>(new D1) : up_cast<B*>(new D2);
        b = boolean_expression ? new D1 : new D2;
}

g ++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3

Обновление изменило имя с implicit_cast в up_cast согласно ответу @ Konrad

10
задан Aaron McDaid 30 May 2011 в 18:12
поделиться