Я не считаю возможным определить все классы, которые наследуются от базового класса автоматически.Как правило, это недостижимо, поскольку разные наследуемые классы могут быть определены в разных единицах компиляции.
Что вы можете сделать, это "зарегистрировать" эти унаследованные классы в некоторой последовательности типов MPL и использовать ее для определения variant
тип.Например, с boost::hana
:
constexpr auto types = boost::hana::tuple_t<char, short, int, long>;
using variant = decltype(boost::hana::unpack(
types, boost::hana::template_<std::variant>))::type;
static_assert(std::is_same_v<variant, std::variant<char, short, int, long>>);
В вашем случае это будет:
constexpr auto types = boost::hana::tuple_t<Dog, Cat>;