老是记不住的模板
类模板与模板类的区别
类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数。
模板类是实实在在的类定义,是类模板的实例化。类定义中参数被实际类型说代替。
类函数同理
只有当用到了实际的模板类或模板函数,编译器才会创建一个实际的模板函数定义
例如:
template < class T > //T为类型形式参数 T max( T a, T b) { return a>b?a:b; } void main() { cout << "max(3,5) is" //这里3,5为实际参数 << max(3,5) <<endl; cout <<"max('3','5') is" << max('3','5')<<endl; }
运行结果为:
max(3,5) is 5
max(‘3’,‘5’) is 5
当编译器发现用指定数据类型调用函数模板时,才会创建一个模板函数。
上例中,当编译程序发现max(3,5)调用时,它就产生了一个如下的函数定义,生成其程序代码:
这样实际参数是什么类型,返回值也是什么类型。
int max ( int a, int b)
{
return a>b?a:b;
}
类模板
template<class T> class List { public : list(); ~list(); void add(T&); void Remove(T&); }
template<class T> List<T>::List()
{
pFirst = 0;
}
template < class T >
void List < T >::Add( T& t )
{
Node * temp = new Node;
temp->pT = &t;
temp->pNext = pFirst;
pFirst = temp;
}
void List<T>::Remove(T& t)
{
.......
}
template< class T>
T* List<T>::Find( T& t)
{
.......
}
使用类模板
定义一个list对象
List<float> floatList;
编译器发现实际参数为float就定义了一个float的list类。
其他例子:
#include <iostream> template <typename T> class Foo { public: Foo() {} ~Foo() {} //成员函数有自己的模板参数 template <typename S> void print_s_a(S p) { std::cout << "S= " << p << std::endl; std::cout << "T = " << _a << std::endl; } template <typename TT> void print_tt_a(TT p); private: T _a; }; //注意成员模板函数定义在类外的方法 template <typename T> template <typename TT> void Foo<T>::print_tt_a(TT p) { std::cout << "TT = " << p << std::endl; std::cout << "T = " << _a << std::endl; } int main() { Foo<int> f; f.print_s_a("123"); f.print_tt_a("456"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了