制作类似元组的编译时间"链接列表"使用可变参数模板

时间:2015-03-27 02:43:33

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

我在考虑std::tuple的可能实现(以及任何类似的模板类,其中包含可变数量的"成员"在编译时定义),我想也许可以创建一个&#34 ;递归类型"类似于链表。我尝试编译以下测试用例:

template <typename FirstType, typename... OtherTypes>
class TupleLite
{
  public:
    FirstType type_;
    TupleLite<OtherTypes...> other_types_;
};

int main()
{
  TupleLite<int,double> mytuple;
}

类本身编译时没有错误,但实例化会抛出错误wrong number of template arguments (0, should be 1 or more)。我相信这是因为TupleLite<int, double>尝试实例化TupleLite<double>,它试图实例化TupleLite<>,但没有有效的定义。

这个&#34;递归大小的班级&#34;打捞?我尝试定义&#34;无参数专业化&#34; TupleLite如下:

template <>
class TupleLite {}

....但这似乎不起作用,尽管g++clang++似乎不确定原因。

g++开始,最相关的错误似乎是:

error: template specifiers not specified in declaration of ‘template<class FirstType, class ... OtherTypes> class TupleLite’
  class TupleLite
        ^
error: wrong number of template arguments (0, should be 1 or more)
 TupleLite<OtherTypes...> other_types_;
                          ^
然而,

clang++说:

error: extraneous 'template<>' in declaration of class 'TupleLite'
template <>
^
error: redefinition of 'TupleLite' as different kind of symbol
class TupleLite
      ^

1 个答案:

答案 0 :(得分:3)

TupleLite的主要模板定义指定它至少需要一个模板参数FirstType。既然这不是你要表达的内容,那么提供一个主要的模板定义,最终也会处理这样的空案例:

template <typename...>
class TupleLite{};

一个部分专业化:

template <typename FirstType, typename... OtherTypes>
class TupleLite<FirstType, OtherTypes...>
{
  public:
    FirstType type_;
    TupleLite<OtherTypes...> other_types_;
};

Coliru Demo

编辑:感谢Nikos指出在这种情况下不需要空的规格。