是否可以创建模板模板参数列表?

时间:2018-09-18 16:05:39

标签: c++ c++11 templates variadic-templates template-templates

我想知道是否可以创建一个包含模板模板参数的列表,例如

template <
    template <typename...> class TTP0,
    template <typename...> class... TTPs
>
struct TTP_List : TTP_List<TTPs...> {};

我遇到的一个问题是我不知道一种访问列表元素TTP0的好方法。我想使用类型别名typedefusing。但是,我知道这是不可能的,因为模板模板参数不是类型,因此不能这样对待。

我能想象到的一种方法是制作显式结构来读取数据并使用专门化的数据,例如:

template <template <typename...> class>
struct container_TTPs;

template <template <typename...> class TTP>
struct container_TTPs<std::vector> {};

但是,这种方法似乎非常明确。如果不使用模板专门化,是否有办法实现这种识别?

随时问我是否需要详细说明。

编辑:例如,我希望能够对每种保留的类型使用某些表达式,例如TestClass<TTP_List<std::vector, std::list>>::value,其中TestClass使用std :: vector和std :: list,而没有需要在TestClass中使用可变参数模板,以便可以传递多个TTP_List

2 个答案:

答案 0 :(得分:3)

我不明白“访问列表中的元素”是什么意思。

在我看来,您应该给我们一个示例,具体说明您要访问列表中的元素的情况。

无论如何,您可以使用using来访问(?)类型名称

template <typename T0, typename ... Ts>
struct foo 
 { 
   using type = T0;
 };

您可以使用模板using来“访问”(?)模板模板参数,如下所示

template <template <typename...> class T0, 
          template <typename...> class ... Ts>
struct foo 
 { 
   template <typename ... As>
   using templ_type = T0<As...>;
 };

您可以通过这种方式使用

// vi is a std::vector<int>
foo<std::vector, std::set, std::map>::templ_type<int> vi { 0, 1, 2 };

答案 1 :(得分:1)

问题(问题)是模板参数可变参数列表(如果是类型名称,值或模板模板,则不重要)必须在最后位置。

所以

template <typename ... Ts, typename T0>
struct foo 
 { };

是错误的,因为Ts...必须位于最后一个位置,并且

template <typename T0, typename ... Ts>
struct foo 
 { };

是正确的。

使用template-template参数,

template <template <typename ...> class ... Ts,
          template <typename ...> class T0>
struct foo 
 { };

错在哪里

template <template <typename ...> class T0,
          template <typename ...> class ... Ts>
struct foo 
 { };

是正确的。