遍历模板参数包,不带参数的专业化的作用是什么?

时间:2019-09-07 14:05:48

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

我有以下代码:

template<typename... Types>
struct TupleSize;

template<typename Head, typename... Tail>
struct TupleSize<Head, Tail...>
{
    static const size_t value = sizeof(Head) + TupleSize<Tail...>::value;
};

template<> struct TupleSize<>
{
    static const size_t value = 0;
};


int main()
{
    //consuming_templates();
    //template_functions();
    //variadic();
    TupleSize<>::value;
    TupleSize<int, double, char>::value;
    getchar();
    return 0;
}

我不知道它的作用是什么

template<typename... Types>
struct TupleSize;

实际上在哪里使用,因为我知道TupleSize <> :: value;返回0和另一段代码:

template<typename Head, typename... Tail>
struct TupleSize<Head, Tail...>
{
    static const size_t value = sizeof(Head) + TupleSize<Tail...>::value;
};

用于拆分参数包并递归计算值。

这只是一个声明,如果是,为什么,如果不是,它在哪里使用。我能想象的唯一情况是递归达到最终值,即变为TupleSize时。但是我不明白模板结构类型如何像这样存在,不是吗?

template<typename... Types>
struct TupleSize<typename... Types>; 

1 个答案:

答案 0 :(得分:2)

  

这只是一个声明,如果是,为什么,如果不是,则在哪里使用

这是主模板的声明,采用任意模板参数。它有两个专业:永远不会使用主模板,因为当指定1个模板参数或多个模板参数大于1时,将选择第一个专业化;如果指定非模板(空)参数,则选择第二个专业化。