使用可变参数模板制作类似元组的编译时 "linked-list"

Making a tuple-like compile-time "linked-list" with variadic templates

我正在考虑 std::tuple 的可能实现(以及任何类似的模板 classes,在编译时定义了可变数量的 "members"),我认为也许可以创建a "recursive type" 类似于链表。我尝试编译以下测试用例:

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

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

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

这个"recursively sized class"还能挽回吗?我尝试定义 TupleLite 的 "no-argument specialization" 如下:

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
      ^

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 指出在这种情况下不需要空规范。