C++/CLR泛型与C++模板的对比(二)

2014-11-24 13:16:32 · 作者: · 浏览: 17
它同时还约束了能够成功地绑定到你的类模板的类型参数。例如,如果你编写下面的代码,aObj的声明就是非法的(在这种特定的情况下),编译器会报错误信息:

int demoMethod()
{
  Demonstration<int> ^demi =
  gcnew Demonstration<int>( 1024 );
  return dm->method();
}

   当然,其特定的约束是,这个类型参数必须包含一个叫做A的类型的嵌套声明。如果它的名字叫做B、C或Z都没有关系。更普通的约束是类型参数必须表示一个类,否则就不允许使用T::范围操作符。我使用int类型参数同时违反了这两条约束。例如,Visual C++编译器会生成下面的错误信息:

error C2825: ’T’: must be a class or namespace when followed by ’::’
   C++模板机制受到的一条批评意见是:缺乏用于描述这种类型约束的形式语法(请注意,在参数化类型的原始设计图纸中,Bjarne Stroustrup论述了曾经考虑过提供显式约束语法,但是他对这种语法不太满意,并选择了在那个时候不提供这种机制)。也就是说,在一般情况下,用户在阅读源代码或相关的文档,或者编译自己的代码并阅读随后的编译器错误消息的时候,才能意识到模板有隐含约束。
如果你必须提供一个与模板不匹配的类型参数该怎么办呢?一方面,我们能做的事情很少。你编写的任何类都有一定的假设,这些假设表现为某些使用方面的约束。很难设计出适合每种情况的类;设计出适合每种情况和每种可能的类型参数的模板类更加困难。
另一方面,存在大量的模板特性为用户提供了"迂回"空间。例如,类模板成员函数不会绑定到类型参数,直到在代码中使用该函数为止(这个时候才绑定)。因此,如果你使用模板类的时候,没有使用那些使类型参数失效的方法,就不会遇到问题。

   如果这样也不可行,那么还可以提供该方法的一个专门的版本,让它与你的类型参数关联。在这种情况下,你需要提供Demonstration<int>::方法的一个专用的实例,或者,更为普遍的情况是,在提供整数类型参数的时候,提供整个模板类的专门的实现方式。

   一般来说,当你提到参数化类型可以支持多种类型的时候,你一般谈到的是参数化的被动使用--也就是说,主要是类型的存储和检索,而不是积极地操作处理它。

   作为模板的设计人员,你必须知道自己的实现对类型参数的隐含约束条件,并且努力去确保这些条件不是多余的。例如,要求类型参数提供等于和小于操作是合理的;但是要求它支持小于或等于或XOR位运算符就不太合理了。你