这不使用任何 hana 功能,但应该可以工作。
首先,一个transcribe
类型函数,它接受一个模板和一个不同模板的实例,并将第二个中的类型转换为第一个:
template<template<class...>class To, class From>
struct transcribe;
template<template<class...>class To, class From>
using transcribe_t=typename transcribe<To,From>::type;
template<template<class...>class Z, template<class...>class Src, class...Ts>
struct transcribe<Z, Src<Ts...>> {
using type=Z<Ts...>;
};
现在,一个接受类型并返回 hana 类型的 hana 元组的模板:
template<class...Ts>
using tuple_of_types = boost::hana::tuple<boost::hana::type<Ts>...>;
我们完成了:
template<class Src>
using get_types_from = transcribe_t< tuple_of_types, Src >;
using result = get_types_from< my_variant >;
get_types_from
是因为提取任意模板的模板参数的类型函数似乎很有用。