如何从 Alexandrescu A. "Modern C++ Design. Generic Programming and Design Patterns Applied" 编译模板 class 'Append'?

How can I compile template class 'Append' from Alexandrescu A. "Modern C++ Design. Generic Programming and Design Patterns Applied"?

Alexandrescu 在他的书中实现了模板 class 'Append' 以这种方式将类型附加到类型列表:

template <class TList, class T> struct Append;

template <> struct Append<NullType, NullType>
{
    typedef NullType Result;
};

template <class T> struct Append<NullType, T>
{
    typedef TYPELIST_1(T) Result;
};

template <class Head, class Tail>
struct Append<NullType, Typelist<Head, Tail> >
{
    typedef Typelist<Head, Tail> Result;
};

template <class Head, class Tail, class T>
struct Append<Typelist<Head, Tail>, T>
{
    typedef Typelist<Head,
        typename Append<Tail, T>::Result>
        Result;
};

所有 'Append' 特化接受不超过 2 个模板参数,但最后一个接受 3 个模板参数。尝试编译该代码时出现错误

error C2977: 'Append' : too many template arguments

这发生在 msvc 编译器或 gcc 上。 'Append' 实施是否正确?

Append 模板结构接受两个且仅两个参数:TListT

所有其他条目都是 specializations,描述了一种特殊情况,当 TTList 的值是特殊的东西时。最后一个 Append 专业化是针对特殊情况的:

  • T 是任意类型
  • TListTypelist<Head, Tail> 的形式,其中 HeadTail 是任意类型名称。我假设 Typelist 之前在某处定义为另一个 2 参数模板。

如果你想用最后一个特化创建一个实例,你将不得不使用Typelist,例如

Append< Typelist<char, short>, int> object;

(为了举例,我完全随意选择了charshortint,不知道对实际的Append实施)