transform_v2t
函数构建了一个模板类A实例的元组:
template <typename T>
struct A
{
T val;
};
template <class V, template <class> class T, std::size_t... index>
inline constexpr auto transform_v2t(std::index_sequence<index...>)
{
return std::make_tuple(T<std::variant_alternative_t<index, V>>() ...);
}
template <class V, template <class> class T>
inline constexpr auto transform_v2t()
{
return transform_v2t<V, T>(std::make_index_sequence<std::variant_size_v<V>>());
}
typedef std::variant<bool, char, int, float, double, std::string> V;
int main()
{
auto t1 = transform_v2t<V, A>();
}
是否可以将相同的transform_v2t
函数应用于具有两个模板参数的类,例如:
template <typename P, typename T>
struct B
{
P other_val;
T val;
};
P的专业为int
?
使用伪代码,它可能是这样的:
template <class T> typedef B<int, T> PartiallySpecializedB;
auto t2 = transform_v2t<V, PartiallySpecializedB>();
答案 0 :(得分:6)
请不要在C ++ 11后的代码中使用typedef
,而总是喜欢using
(称为别名声明)。
由于您声明的名称在左侧(而不是...随处可见),因此它们不仅更易于阅读:
using V = std::variant<bool, char, int, float, double, std::string>;
...但是它们也支持别名模板声明:
template <class T>
using PartiallySpecializedB = B<int, T>;
auto t2 = transform_v2t<V, PartiallySpecializedB>();