如何从 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
模板结构接受两个且仅两个参数:TList
和 T
。
所有其他条目都是 specializations,描述了一种特殊情况,当 T
或 TList
的值是特殊的东西时。最后一个 Append
专业化是针对特殊情况的:
T
是任意类型
TList
是 Typelist<Head, Tail>
的形式,其中 Head
和 Tail
是任意类型名称。我假设 Typelist
之前在某处定义为另一个 2 参数模板。
如果你想用最后一个特化创建一个实例,你将不得不使用Typelist
,例如
Append< Typelist<char, short>, int> object;
(为了举例,我完全随意选择了char
、short
、int
,不知道对实际的Append
实施)
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
模板结构接受两个且仅两个参数:TList
和 T
。
所有其他条目都是 specializations,描述了一种特殊情况,当 T
或 TList
的值是特殊的东西时。最后一个 Append
专业化是针对特殊情况的:
T
是任意类型TList
是Typelist<Head, Tail>
的形式,其中Head
和Tail
是任意类型名称。我假设Typelist
之前在某处定义为另一个 2 参数模板。
如果你想用最后一个特化创建一个实例,你将不得不使用Typelist
,例如
Append< Typelist<char, short>, int> object;
(为了举例,我完全随意选择了char
、short
、int
,不知道对实际的Append
实施)