1

私が調査したテンプレートでは、整数の引数、つまりint、他のデータ型へのポインター、およびテンプレートテンプレートパラメーターのみを持つことができます。

しかし、ここでは単純なクラスをテンプレート引数としても渡すことができます。これは有効ですか、それとも私が理解していることは間違っています。これがコードの一部です。

template <typename T> 
class A {
  public:
         T t;             
};
class B {
  public:
         float f;      
};
template <template<typename> class X, class H> 
class C {
   public:
          H obj;
          X<int> x;                                
};
int main()
{
    C < A, B > my;
    my.obj.f = 2.3f;
    my.x.t = 5;
    cout << "template class object: " << my.obj.f << endl;
    cout << "class object         : " << my.x.t << endl;
}
4

1 に答える 1

2

テンプレート パラメータには、次の 3 つのタイプがあります。

  • 引数として型を指定する必要がある型パラメータ ( などint) std::string。あなたの例でHは、型パラメータです。
  • 引数として値を指定する必要がある非型パラメータ(例: 42)。あなたの例にはこれらのいずれも含まれていません。
  • クラス テンプレート(適切な数とタイプのパラメーターを受け入れる) を提供する必要があるテンプレート パラメーター。あなたの例でAは、テンプレートパラメータです。

私が調査したテンプレートでは、整数の引数、つまり int、他のデータ型へのポインター、およびテンプレート テンプレート パラメーターのみを持つことができます。

上記の文の最初の部分で言及していることは、パラメータの 2 番目のカテゴリ、つまり非型パラメータに適用され、文の最後の部分はテンプレート テンプレート パラメータをカバーしています。

int実際、型以外のパラメータには、テンプレートをインスタンス化するときに引数として渡すなど、特定の型の値が必要であり、次のX*ような厳しい制約があります。

  • 指定できる型。
  • 指定できる値の性質。

たとえば、これは禁止されています。

template<double D>
struct X { /* ... */ };

これが許可されている間:

template<int* P>
struct X { /* ... */ };

ただし、 の引数として指定できるものには制約がありますP

int main()
{
    int x = 42;
    X<&x> obj; // ERROR!
}

上記の文でカバーされていない部分は最初のカテゴリ (型パラメーター) であり、実際には最も一般的に見られるものです。とりわけ、型パラメーターは、次のようなオブジェクトのジェネリック コレクションをインスタンス化するために使用されます。

std::vector<my_class> v;
于 2013-05-20T11:57:03.240 に答える