Если опция Boost является опцией, рассмотрите возможность использования Boost.Variant .
Вы можете думать о варианте как union
на стероидах. Он работает с большинством типов C ++ и допускает полиморфизм как во время компиляции, так и во время выполнения, но он не требует общего базового класса для типов.
Основным недостатком является то, что он требует значительного количества метапрограммирования шаблонов, поэтому он будет загружать компилятор.
Вот краткий пример, чтобы понять идею:
typedef boost::variant<float, std::string> MyVariant;
MyVariant GetInt() { return MyVariant(42); }
MyVariant GetString() { return MyVariant("foo"); }
MyVariant v;
//run-time polymorphism:
int number = boost::get<int>(v); // this line may throw (basically a dynamic_cast)
//compile time polymorphism:
boost::apply_visitor(Visitor(), v);
// where Visitor is a functor overloading operator() for *all* types in the variant
Более легкая альтернатива - Boost.Any, для сравнения см. на этой странице .