将类作为非类型参数传递给c ++中的模板

时间:2013-05-20 11:48:58

标签: c++ templates template-templates class-template

在我研究的模板中,我们只能有整数参数,即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;
}

1 个答案:

答案 0 :(得分: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;