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

模板参数分为三种类型:

  • 类型参数,必须为其提供类型作为参数(例如intstd::string等)。在您的示例中,H是一个类型参数;
  • 非类型参数,必须为其提供一个作为参数(例如42)。您的示例不包含任何这些;
  • 模板参数,必须为其提供类模板(接受正确数量和类型的参数)。在您的示例中,A是一个模板参数。

在我研究的模板中,我们只能有整数参数,即 int、指向其他数据类型的指针以及模板模板参数。

您在上句的第一部分中所指的内容适用于第二类参数,即非类型参数,并且该句的最后部分涵盖了模板模板参数。

实际上,非类型参数需要特定类型的值,例如intX*在实例化模板时作为参数传递,并且对以下内容有严格的限制:

  • 可以指定的类型;
  • 可以指定的值的性质。

例如,这是禁止的:

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 回答