Функция имеет один тип возврата.Вам нужны разные функции для возврата значений разных типов.
(в C ++ 17 вы можете сделать так, чтобы вы возвращали разные типы из функции, но на самом деле это шаблон, который по-разному создается для различных значений)
Если вы хотите выбрать, что делать в зависимости от типа вашего объединения, вместо этого вы можете черпать вдохновение из std::variant
и принимать функциональный объект с несколькими operator()
с, по одному для каждого возможного типа..
template <typename Return>
struct AVisitor
{
virtual Return operator()(int32_t) const = 0;
virtual Return operator()(uint32_t) const = 0;
virtual Return operator()(uint64_t) const = 0;
virtual Return operator()(bool) const = 0;
virtual Return operator()(std::string) const = 0;
};
template <typename Return>
Return visit(const A & a, const AVisitor<Return> & visitor)
{
switch (a.DataType)
{
case 1: return visitor(a.data.x);
case 2: return visitor(a.data.y);
case 3: return visitor(a.data.mz);
case 4: return visitor(a.data.b);
case 5: return visitor(std::string(a.data.str.ptr));
}
}
struct cout_visitor : AVisitor<void>
{
void operator()(int32_t x) const { std::cout << x; }
void operator()(uint32_t y) const { std::cout << y; }
void operator()(uint64_t mz) const { std::cout << mz; }
void operator()(bool b) const { std::cout << b; }
void operator()(std::string str) const { std::cout << str; }
}
int main()
{
cout_visitor vis;
visit(a1, vis);
visit(a2, vis);
}
Хотя очевидной альтернативой этому было бы определение A
как using A =
(std::
или boost::
) variant<int32_t, uint32_t, uint64_t, bool, std::string>;