Это очень похоже на проблему XY. Вероятно, существует совершенно иное решение вашей проблемы.
C ++ - язык со статической типизацией; это означает, что типы, используемые в данном пути кода, фиксируются во время компиляции. Типы Dynami c (типы, известные во время выполнения) обычно распределяются через кучу или все сразу, а затем выбираются во время выполнения.
Так что, как вы заметили, в вашем случае мало что возможно ..
Например, вы можете просто использовать два разных пути кода:
if (condition_a) {
Thing_variant_a a;
function(a);
} else if (condition_b) {
Thing_variant_a b;
function(b);
}
Предварительно выделить типы:
Thing_variant_a a;
Thing_variant_a b;
if (condition_a) {
function(a);
} else if (condition_b) {
function(b);
}
Или использовать шаблон:
template<typename T>
void do_something() {
T t;
function(t);
}
// somewhere else in the code ...
do_something<Thing_variant_a>();
// or ...
do_something<Thing_variant_b>();
Вот способ использования динамической c памяти и unique_ptr
:
std::unique_ptr<Thing> t;
if (condition_a) {
t = std::make_unique<Thing_variant_a>();
} else if (condition_b) {
t = std::make_unique<Thing_variant_b>();
}
function(*t);
// t is delete'd automatically at end of scope...
И, кстати, такая функция, как int f(){...}
, должна возвращать некоторое значение int
.