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 (参考) 実施数量 [黙示的]

1 コンピュータは有限であるため、C++ の実装では、正常に処理できるプログラムのサイズが必然的に制限されます。すべての実装は、既知の場合、それらの制限を文書化する必要があります。このドキュメントでは、固定された制限が存在する場合にそれを引用したり、利用可能なリソースの関数として可変制限を計算する方法を述べたり、固定された制限が存在しないか不明であると述べたりする場合があります。

2 制限により、以下に説明するものやその他のものを含む数量が制限される場合があります。各数量に続く括弧内の数字は、その数量の最小値として推奨されます。ただし、これらの量は単なるガイドラインであり、準拠を決定するものではありません。

— 直接および間接基本クラス [16 384]。

— 単一クラスの直接基本クラス [1 024]。

— テンプレート実引数推定中の置換を含む、再帰的にネストされたテンプレートのインスタンス化 (14.8.2) [1024]。

于 2013-01-30T12:27:52.353 に答える