【问题标题】:Metaprogramming inheritance limitiations元编程继承限制
【发布时间】:2013-01-30 12:13:34
【问题描述】:

我在 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&lt;Typelist&lt;Type2,Typelist&lt;Type3,NullType&gt;&gt;&gt; 源自: Recur&lt;Typelist&lt;Type3,NullType&gt;&gt; 源自:

Recur<NullType> (base class)

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

【问题讨论】:

  • 最好不要依赖这样的具体实现细节

标签: c++ visual-studio-2010 stl metaprogramming instantiation


【解决方案1】:

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

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

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

2 限制可能会限制数量,包括所描述的数量 下面或其他。每个数量后括号内的数字是 建议作为该数量的最小值。然而,这些 数量仅供参考,不能确定合规性。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多