在没有宏的情况下在 C++98 中创建类型列表时遇到问题
trouble creating a type list in C++98 without macros
所以我正在阅读 Andrei Alexandrescu 的 this article 关于如何创建类型列表的内容,但是文章中的以下代码无法使用 MSVC/GCC 编译:
template <class H, class T>
struct typelist
{
typedef H head;
typedef T tail;
};
class null_typelist {};
template <class T1>
struct cons<T1, null_typelist, null_typelist,
null_typelist>
{
typedef typelist<T1, null_typelist> type;
};
template <class T1, class T2>
struct cons<T1, T2, null_typelist, null_typelist>
{
typedef typelist<T1, typelist<T2,
null_typelist> > type;
};
template <class T1, class T2, class T3>
struct cons<T1, T2, T3, null_typelist>
{
typedef typelist<T1, typelist<T2, typelist<T3,
null_typelist> > > type;
};
template <class T1, class T2, class T3, class T4>
struct cons
{
typedef typelist<T1, typelist<T2, typelist<T3,
typelist<T4, null_typelist> > > > type;
};
typedef cons<float, double, long double>::type
floating_point_types;
我收到以下错误:
a.cpp:21:8: error: 'cons' is not a class template
struct cons<T1, null_typelist, null_typelist,
^~~~
a.cpp:28:49: error: wrong number of template arguments (4, should be 1)
struct cons<T1, T2, null_typelist, null_typelist>
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:35:38: error: wrong number of template arguments (4, should be 1)
struct cons<T1, T2, T3, null_typelist>
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:42:8: error: redeclared with 4 template parameters
struct cons
^~~~
a.cpp:22:18: note: previous declaration 'template<class T1> struct cons' used 1
template parameter
null_typelist>
^
a.cpp:48:40: error: wrong number of template arguments (3, should be 1)
typedef cons<float, double, long double>::type
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:49:5: error: expected initializer before 'floating_point_types'
floating_point_types;
^~~~~~~~~~~~~~~~~~~~
我在 C++98 中需要这个用于我正在编写的库,任何更像可变参数模板或像 boost::mpl
这样的第三方都不是一个选项。
那么问题是什么?我不太喜欢模板元编程(还)...
我不知道是否可以在 msvc 中工作(但可以使用我的 g++)但是,在您的代码中,您声明了 cons
部分特化。
所以,在第一次偏特化之前(题外话:我建议使用 typename
而不是 class
作为模板参数)
template <typename T1>
struct cons<T1, null_typelist, null_typelist,
null_typelist>
{
typedef typelist<T1, null_typelist> type;
};
你应该插入我认为可能类似于
的通用声明
template <typename,
typename = null_typelist,
typename = null_typelist,
typename = null_typelist>
struct cons;
所以我正在阅读 Andrei Alexandrescu 的 this article 关于如何创建类型列表的内容,但是文章中的以下代码无法使用 MSVC/GCC 编译:
template <class H, class T>
struct typelist
{
typedef H head;
typedef T tail;
};
class null_typelist {};
template <class T1>
struct cons<T1, null_typelist, null_typelist,
null_typelist>
{
typedef typelist<T1, null_typelist> type;
};
template <class T1, class T2>
struct cons<T1, T2, null_typelist, null_typelist>
{
typedef typelist<T1, typelist<T2,
null_typelist> > type;
};
template <class T1, class T2, class T3>
struct cons<T1, T2, T3, null_typelist>
{
typedef typelist<T1, typelist<T2, typelist<T3,
null_typelist> > > type;
};
template <class T1, class T2, class T3, class T4>
struct cons
{
typedef typelist<T1, typelist<T2, typelist<T3,
typelist<T4, null_typelist> > > > type;
};
typedef cons<float, double, long double>::type
floating_point_types;
我收到以下错误:
a.cpp:21:8: error: 'cons' is not a class template
struct cons<T1, null_typelist, null_typelist,
^~~~
a.cpp:28:49: error: wrong number of template arguments (4, should be 1)
struct cons<T1, T2, null_typelist, null_typelist>
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:35:38: error: wrong number of template arguments (4, should be 1)
struct cons<T1, T2, T3, null_typelist>
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:42:8: error: redeclared with 4 template parameters
struct cons
^~~~
a.cpp:22:18: note: previous declaration 'template<class T1> struct cons' used 1
template parameter
null_typelist>
^
a.cpp:48:40: error: wrong number of template arguments (3, should be 1)
typedef cons<float, double, long double>::type
^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
null_typelist>
^
a.cpp:49:5: error: expected initializer before 'floating_point_types'
floating_point_types;
^~~~~~~~~~~~~~~~~~~~
我在 C++98 中需要这个用于我正在编写的库,任何更像可变参数模板或像 boost::mpl
这样的第三方都不是一个选项。
那么问题是什么?我不太喜欢模板元编程(还)...
我不知道是否可以在 msvc 中工作(但可以使用我的 g++)但是,在您的代码中,您声明了 cons
部分特化。
所以,在第一次偏特化之前(题外话:我建议使用 typename
而不是 class
作为模板参数)
template <typename T1>
struct cons<T1, null_typelist, null_typelist,
null_typelist>
{
typedef typelist<T1, null_typelist> type;
};
你应该插入我认为可能类似于
的通用声明template <typename,
typename = null_typelist,
typename = null_typelist,
typename = null_typelist>
struct cons;