Последняя строка этого кода не может быть скомпилирована с помощью 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