3

我在 C++ 中使用模板元编程从使用类型列表生成类的层次结构,如下所示:

//! Basic typelist class
template<class H, class T>
class Typelist
{
public:
    typedef H Head;
    typedef T Tail;
};

//! Terminating type
class NullType {};

//! Forward declaration
template<class Types>
class Recur;

//! Specialisation to terminate the recursion
template<>
class Recur<NullType>
{
};

//! General recursive class 
template<class Types>
class Recur: public Recur<typename Types::Tail>
{
};

// Dummy classes 
class Type1{};
class Type2{};
class Type3{};
int main()
{
    // Defines the typelist
    typedef Typelist<Type1,Typelist<Type2,Typelist<Type3,NullType>>> Types;

    // Instantiate the recursion
    Recur<Types> recur;
    return 1;
}

这将产生一个类层次结构,如下所示:

Recur<Typelist<Type2,Typelist<Type3,NullType>>>源自: Recur<Typelist<Type3,NullType>>源自:

Recur<NullType> (base class)

问题:Visual Studio 2010 编译器是否对使用这种递归技术的类派生深度有任何限制?换句话说,如果我的类型列表包含 N 个类型,即使 N 等于 100,000,上面的代码是否会编译和构造 N 个类?

4

1 回答 1

2

该标准的附件 B仅指定了最低级别的直接和间接基类以及嵌套模板实例化,并且特定编译器是否超出此范围是实现质量问题。请参阅您的特定编译器自己的文档以获取 precies 编号。以下遵循标准要求的最低数量。

附件 B(资料性)实施数量 [implimits]

1 由于计算机是有限的,C++ 实现不可避免地受限于它们可以成功处理的程序的大小。每个实施都应在已知的情况下记录这些限制。本文档可能会引用存在的固定限制,说明如何根据可用资源计算可变限制,或者说固定限制不存在或未知。

2 限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。

— 直接和间接基类 [16 384]。

— 单个类的直接基类 [1 024]。

— 递归嵌套的模板实例化,包括模板参数推导期间的替换 (14.8.2) [1 024]。

于 2013-01-30T12:27:52.353 回答