Единственный способ сделать эту работу - это использовать union
(поскольку я не мог заставить его работать с использованием std::variant
или std::any
, поскольку оба они требуют, чтобы Foo и Bar были как минимум подвижными)
Вам нужна динамическая структура, которая будет действовать как тип возвращаемого значения:
// acts as home made std::variant
struct Dynamic {
union {
Foo foo;
Bar bar;
};
int active;
};
и создавать ее с использованием назначенных инициализаторов C ++ 20, но уже есть и работает в текущих GCC и Clang:
Dynamic make_dynamic(int a, bool x) {
if (x) {
return {{.foo = Foo{2}}, 0};
} else {
return {{.bar = Bar{2}}, 1};
}
}
И, наконец, мы можем получить наш динамический Foo:
Dynamic dynamic = make_dynamic(10, true);
Foo* foo = dynamic.get();
https://godbolt.org/z/7JWB6D
Вы также можете добавить методы getFoo () и getBar () для возврата ссылок наDynamic
структура.