使用可变参数模板制作类似元组的编译时 "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_;
};
编辑:感谢 Nikos 指出在这种情况下不需要空规范。
我正在考虑 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_;
};
编辑:感谢 Nikos 指出在这种情况下不需要空规范。