To get a parent std::variant
from a class derived from it (if I understand you correctly, you want to accept derived classes too), do this:
template <typename ...P>std::variant<P...> &VariantIdentity(std::variant<P...> &);template <typename T>using ToBaseVariant = std::remove_reference_t<decltype((VariantIdentity)(std::declval<T &>()))>;
Then you can extract the arguments from the variant using partial specialization. E.g. of a base class of X
, or as the other answer suggests, a completely separate class.
template <typename T>class XBase;template <typename ...P>class XBase<std::variant<P...>>{ std::tuple<P...> t;};template <typename T>class X : XBase<ToBaseVariant<T>>{ using XBase<ToBaseVariant<T>>::XBase;};