Скажем, у меня есть такой код:
class B {}
class D : class B {}
void MakeD(int params, D** out, int* status_out);
Сегодня я называю это так:
B* b;
if (use_d) {
D* d;
MakeD(params, &d, &status)
b = d;
} else...
Есть ли более чистый способ написать это, избегая отдельного объекта ‘d’, но не теряя существующую безопасность типов (т.е. нет reinterpret_cast)?
Есть ли причина, по которой вы не можете просто изменить свой метод MakeD (), чтобы он возвращал новый D вместо передачи указателя на D?
то есть.
D* MakeD(int params, int* status_out);
...
b = MakeD(params, &status);
Или метод MakeD () является частью чужого API?
Почему бы не использовать основные функции C ++, такие как конструктор классов и полиморфизм: B* b = new D(params);
Что-то вроде
B *b = use_d ? new D(params) : new <something else>;
должно сработать. Я предполагаю что-то другое вероятно B
объект (может быть построен с использованием других параметров?) Это должно быть B
или класс, полученный из B
чтобы код работал.
И, как всегда, не используйте сырье B*
вместо
std::unique_ptr<B> ptr( use_d ? new D(params) : new <something else> );