提示:以下是本篇文章正文内容,下面案例可供参考
一、函数模板
函数模板可以理解为用来解决逻辑相同参数类型不同的。编译器通过实参来推断类型,并实例化模板。
(1)语法
template <class T1,class T2.....>
返回值类型 函数名 参数列表{}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

(2)隐式实例化和显示实例化
1.隐式实例化:
编译器通过函数的实参的类型来推导 T类型
template<class T >
T Add( const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);//T是int
Add(d1, d2);//T是double
2.显式实例化:
我们直接指定T的类型(强转或者<type>)
如果只有一个类型T,但是我们传入了两个不同类型的参数,这时编译器不知道T是int还是double,还有就是函数模板是不支持类型自动转换的,而普通函数可以。比如下面的例子,显式指明Add为int,它就和普通函数一样了,它就可以进行参数的隐式类型转化。

其实显示实例化的最大的用处是当编译器不能通过实参来判断T的类型的时候,我们通过这样的方式
template<class T>
T sw()
{
T a = 1;
T b = 2;
return a + b;
}
int main()
{
int sum=0;
sum=sw<int>();
return 0;
}
(3)函数模板的匹配规则
如果函数模板名字和另一个函数名相同,它们不会冲突。
template<class T1,class T2>
T1 Add( const T1& left, const T2& right)
{
return left + right;
}
int ADD(const int& left, const int& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);//优先匹配非模板
Add(a1, d1);//匹配模板
}
二、类模板
1.类模板语法
template<T1 class,T2 class,.......Tn class>
class 类模板名 { // 类内成员定义 };
template<class T>
class mystring {
public:mystring(const T* str = " ")
{
_size = strlen(str);
_capacity = _size;
_str = new char[_size + 1];
strcpy(_str, str);
}
~mystring()
{
delete[]_str;
_str = nullptr;
_capacity = 0;
_size = 0;
}
typedef char* vetor;
vetor being()
{
return _str;
}
vetor end()
{
return _str + _size;
}
size_t size();//类外定义
private:
T* _str;
int _size;
int _capacity;
};
template<class T>::size_t size()
{
return this->_size;
}
int main()
{
mystring<char> s1("hello linux");
return 0;}
注意点:我们如果在类模板中进行函数的声明,在类外定义时最好在同一个文件中
对象s1的数据类型是mystring<char> ,而在普通类它的类型是类名
![]()
本文介绍了C++中的函数模板,包括隐式和显式实例化,以及模板的匹配规则。同时详细讲解了类模板的语法和使用注意事项,如在类外定义模板函数的方法。

被折叠的 条评论
为什么被折叠?



