C++中的template学习

本文介绍了C++中的模板概念,包括函数模板和类模板的具体定义与使用方法。通过实例展示了如何利用模板实现通用编程,例如创建泛型的幂运算函数及三元素类。

引用自《深入浅出MFC》

c++中的template有两种,一种是function,另一种针对class

  • 针对function的: 针对class

       定义:

 

template <class T> T power(T baseint exponent);

 

       使用:

 

template <class T> 
              T power(T 
baseint
 exponent)
             
{
                   T result 
= base
;
                   
if (exponent == 0)  return (T)1
;
                   
if (exponent < 0)   return (T)0
;
                   
while (--exponent)  result *= base
;
                     
return
 result;
              }


             #include 
<iostream.h>
                
void main()
                
{
                       
int i = power(54
);
                       
long l = power(1000L3
);
                       
long double d = power((long double)1e5, 2
)
                       cout 
<< "i= " << i <<
 endl;
                       cout 
<< "l= " << l <<
 endl;
                       cout 
<< "d= " << d <<
 endl;
                  }


 

 

  •  
 template <class T>
 
class CThree
 
{
     
public
 :
             CThree(T t1, T t2, T t3);
             T Min();
             T Max();
 
private
:
             T a, b, c;
}
;

template 
<class T>

T CThree
<T>::Min()
 
{
          T minab 
= a < b ?
 a : b;
           
return minab < c ?
 minab : c;
 }


template 
<class T>
T CThree
<T>::Max()
 
{
          T maxab 
= a < b ?
 b : a;
           
return maxab < c ?
 c : maxab;
 }

 template 
<class T>
CThree
<T>::CThree(T t1, T t2, T t3) :
       a(t1), b(t2), c(t3)
 

        
return
;
 }


                使用:

#include <iostream.h>
void main()
{
      CThree
<int> obj1(254);
     cout 
<< obj1.Min() << endl;
     cout 
<< obj1.Max() << endl;
     CThree
<float> obj2(8.52-6.754.54);
     cout 
<< obj2.Min() << endl;
     cout 
<< obj2.Max() << endl;
    CThree
<long> obj3(646600L437847L364873L);
cout 
<< obj3.Min() << endl;
cout 
<< obj3.Max() << endl;
}
<think>好的,用户想了解C++模板的使用方法、示例和语法。首先,我需要回顾一下模板的基础知识,确保自己记得正确。模板分为函数模板和类模板,语法是使用template关键字后跟模板参数列表。 用户的问题提到了函数模板和类模板,所以应该分别给出两者的说明和示例。比如,函数模板可以用来创建通用函数,比如交换两个变量的值或者求最大值。类模板则可以用于创建泛型类,比如数组类或者栈结构。 接下来要确保语法正确。函数模板的语法是template<typename T>或者template<class T>,两者在C++中基本可以互换,但通常推荐使用typename。类模板的语法类似,但在定义成员函数时需要在类外使用模板参数。 然后需要提供示例代码。比如函数模板的例子,交换函数swap,或者求最大值的maxValue。类模板的例子可以是Array类,展示如何存储不同类型的数据。示例代码要简洁明了,能够突出模板的使用方式。 还要注意用户可能遇到的常见问题,比如显式实例化模板、模板特化等。这些内容可以作为扩展知识,帮助用户更深入理解模板的高级用法。 需要检查是否有遗漏的部分,比如模板参数可以有多个,非类型模板参数,或者模板的默认参数。这些内容虽然可能对新手来说有点复杂,但简要提及可以让回答更全面。 最后,生成相关问题时要围绕模板的常见疑惑,比如特化与偏特化、与宏的区别、如何避免代码膨胀等。这些问题能引导用户进一步学习,满足他们的潜在需求。 确保所有代码示例正确,符合C++标准,并且注释清晰。避免使用C++11及以上版本的特性,除非用户特别说明,但通常模板的基本用法在旧标准中已经存在,所以应该没问题。 总结一下,回答的结构应该是先介绍函数模板和类模板的语法,分别给出示例,然后讨论注意事项和高级话题,最后生成相关问题。这样用户能逐步从基础到进阶了解模板的用法。</think># C++模板使用方法详解 ## 一、模板基础语法 C++模板使用`template`关键字定义,支持两种模板机制: 1. **函数模板**:`template<typename T>`或`template<class T>` 2. **类模板**:`template<class T1, class T2>`(支持多个类型参数) 两种声明方式`typename`和`class`等价,但推荐使用`typename`表示类型参数[^1] ## 二、函数模板示例 ### 1. 通用交换函数 ```cpp template<typename T> void mySwap(T& a, T& b) { T temp = a; a = b; b = temp; } ``` 使用示例: ```cpp int x = 5, y = 10; mySwap(x, y); // 自动推导类型 double a = 3.14, b = 2.718; mySwap<double>(a, b); // 显式指定类型 ``` ### 2. 求最大值函数 ```cpp template<class T> T maxValue(T a, T b) { return (a > b) ? a : b; } ``` ## 三、类模板示例 ### 1. 泛型数组类 ```cpp template<typename T, int N> class Array { private: T m_data[N]; public: int size() const { return N; } T& operator[](int index) { return m_data[index]; } }; ``` 使用示例: ```cpp Array<int, 5> intArr; // 创建存储5个int的数组 Array<double, 10> doubleArr; // 创建存储10个double的数组 ``` ### 2. 栈模板类 ```cpp template<class T> class Stack { private: std::vector<T> elements; public: void push(const T& elem) { elements.push_back(elem); } T pop() { T elem = elements.back(); elements.pop_back(); return elem; } }; ``` ## 四、模板注意事项 1. **显式实例化**:当模板定义与声明分离时,需要在.cpp文件中显式实例化 ```cpp // 显式实例化声明 template class Array<std::string, 100>; ``` 2. **模板特化**:为特定类型提供特殊实现 ```cpp template<> class Array<bool, 10> { // 针对bool类型的特化实现 }; ``` ## 五、应用场景 1. 容器类(vector、list等) 2. 算法库(sort、find等) 3. 智能指针(shared_ptr、unique_ptr) 4. 元编程和类型萃取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值