Последняя строка этого кода не скомпилируется с помощью castingAndTernary.cpp:15: error: conditional expression between distinct pointer types ‘D1*’ and ‘D2*’ lacks a cast
У действительно умного компилятора не должно быть никаких трудностей, потому что оба могут быть безопасно добавлены к B*
(базовому классу). Я не хочу использовать static_cast и dynamic_cast и так далее. Я беспокоюсь, что когда-нибудь буду смешивать классы и получать поведение undefined. Вот почему я создал шаблон 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