设为首页 加入收藏

TOP

8.7.3 使用有多个形参的类模板(1)
2013-10-07 16:09:01 来源: 作者: 【 】 浏览:65
Tags:8.7.3 使用 多个 模板

8.7.3  使用有多个形参的类模板(1)

要在类模板中使用多个类型形参,只需简单地扩展刚才看到的使用单个形参的示例即可。可以在模板定义中的任何位置使用各个类型形参。例如,可以定义一个使用两个类型形参的类模板:
 

  1. template<class T1, class T2> 
  2. class CExampleClass  
  3. {  
  4. // Class data members  
  5. private:  
  6. T1 m_Value1;  
  7. T2 m_Value2;  
  8. // Rest of the template definition...  
  9. };  

上面那两个类数据成员的类型取决于初始化类模板的对象时为形参提供的类型。可以显式实例化模板而无须定义任何对象。例如,在CSamples模板的定义后面可以编写如下语句:

  1. template class CSamples<Foo>

这个语句显式实例化了Foo类型的CSamples,但它没有实例化任何对象。如果Foo没有实现模板所需要的所有成员函数,那么编译器在进行上述显式实例化时将生成一个错误消息,就好像在定义这种类型的对象那样生成错误消息。

类模板中形参的类型不受限制。还可以在类定义中使用一些需要以常量或常量表达式进行替换的形参。在前面的CSamples模板中,我们随意将数组m_Values定义成包含100个元素。然而,还可以让该模板的用户在实例化对象时选择数组的大小,方法是将该模板定义成如下形式:

  1. template <class T, size_t Size> class CSamples  
  2. {  
  3. private:  
  4. T m_Values[Size];                   // Array to store samples  
  5. int m_Free;                          // Index of free location in m_Values  
  6. public:  
  7. // Constructor definition to accept an array of samples  
  8. CSamples(const T values[], int count)  
  9. {  
  10. m_Free = count < Size   count : Size;      // Don't exceed the array  
  11. for(int i = 0; i < m_Free; i++)  
  12. m_Values[i] = values[i];                    // Store count number of samples  
  13. }  
  14. // Constructor to accept a single sample  
  15. CSamples(const T& value)  
  16. {  
  17. m_Values[0] = value;                 // Store the sample  
  18. m_Free = 1;                            // Next is free  
  19. }  
  20. CSamples() : m_Free(0) {}                                       // Default constructor  
  21. // Function to add a sample  
  22. int Add(const T& value)  
  23. {  
  24. int OK = m_Free < Size;             // Indicates there is a free place  
  25. if(OK)  
  26. m_Values[m_Free++] = value;                     // OK true, so store the value  
  27. return OK;  
  28. }  
  29. // Function to obtain maximum sample  
  30. T Max() const  
  31. {  
  32. // Set first sample or 0 as maximum  
  33. theMax = m_Values[0];  
  34. for(int i = 1; i < m_Free; i++)        // Check all the samples  
  35. if(m_Values[i] > theMax)  
  36. theMax = m_Values[i];                // Store any larger sample  
  37. return theMax;  
  38. }  
  39. };  

创建对象时给Size提供的数值将代替整个模板定义中该形参的所有实例。现在,可以像下面这样声明前面示例中的CSamples对象:

  1. CSamples<CBox, 3> myBoxes(boxes,  _countof(boxes));); 

因为可以为Size形参提供任何常量表达式,所以还可以这样写:

  1. CSamples<CBox, _countof(boxes)> myBoxes(boxes, _countof(boxes))); 

不过,该示例的这种模板用法不太好,原来的版本要灵活得多。使Size成为模板形参的结果是,那些存储相同类型的对象但Size形参值不同的模板实例是完全不同的类,而且不能混用。例如,CSamples<double, 10>类型的对象不能在包含CSamples<double, 20>类型对象的表达式中使用。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇8.7.2 根据类模板创建对象(2) 下一篇8.7.3 使用有多个形参的类模板(2..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·python数据分析岗的 (2025-12-25 10:02:21)
·python做数据分析需 (2025-12-25 10:02:19)
·成为一个优秀的pytho (2025-12-25 10:02:16)
·Java后端面试实习自 (2025-12-25 09:24:21)
·Java LTS版本有哪些 (2025-12-25 09:24:18)