在没有宏的情况下在 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;