5

私のコードは次のとおりです。

#include <iostream>

using namespace std;


template <typename T, int X>

class Test
{
   private:
    T container[X];
   public:
    void printSize();

};
template <typename T, int X>
void Test<T,X>::printSize()
{
    cout <<"Container Size = "<<X <<endl;
}


int main()
{
    cout << "Hello World!" << endl;
    Test<int, 20> t;
    Test<int, 30> t1;

    t.printSize();
    t1.printSize();
    return 0;
}

質問:

  1. 生成されるスペシャライゼーションの数は?. <int, 20> 私の理解が正しければ、 用と用の 2 つの特殊化が生成され<int, 30>ます。私の理解が間違っている場合は、親切に修正してください。
  2. リバース エンジニアリングによって生成されたスペシャライゼーションの数を表示/確認する方法はありますか?
4

3 に答える 3

3

ここには特殊化はなく、インスタンス化のみがあります(この質問は違いを説明しています)。このコードは、クラス テンプレートの 2 つのインスタンスを生成しますTest

于 2013-04-18T08:13:03.580 に答える
2

1) はい、コンパイラによって 2 つのインスタンス化が生成されますが、リンカは (プログラム全体の最適化などを使用して) 同じ生成コードで関数をマージする可能性があります。

2) gcc がテンプレートのインスタンス化出力を生成する方法が説明されているこの質問を参照してください。

于 2013-04-18T08:13:03.023 に答える
0

a) あなたの例では、特殊化の 2 つのインスタンスが作成されます。

b) クラスに対して生成された特殊化の数をサポートする組み込みメソッドはありません。プロジェクトの場合は、静的カウントを追加できます。必要に応じて、クラスに独自の参照カウント メカニズムを記述できます。コンストラクターで静的カウントを増やします。

static int created = 0;
static int alive = 0;
class Test
{
counter()
    {
        created++;
        alive++;
    }
~counter()
{
  created--;
}
//Rest of class
};
于 2013-04-18T08:20:25.390 に答える