本文介绍: 例如设计一个数组类型,这个数组可能只能存放 int 类型的数据,但是我们在使用数组时,不一定总是用 int 数组,可能需要其他类型的数组即,数组是一个通用的概念,不应该局限于某种特定的类型(如 int 类型),如果,设计出来的数组,能存放任意类型的元素,那么这就是泛型。开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。在 C++中,用模板来实现泛型,或者说 用模板来表示通用的概念。
例如设计一个数组类型,这个数组可能只能存放 int 类型的数据,但是我们在使用数组时,不一定总是用 int 数组,可能需要其他类型的数组即,数组是一个通用的概念,不应该局限于某种特定的类型(如 int 类型),如果,设计出来的数组,能存放任意类型的元素,那么这就是泛型。
模板
函数模板
int main(int argc, char const *argv[])
{
swap(1,2); //整数交换
swap(2.3,5.7); //浮点数交换
swap(2,3.14); //error,两个类型不同的数交换
return 0;
}
类模板
函数可以有模板,类也可以拥有模板,类的模板格式为:
template<typename T1,typename T2>
class A
{
private:
T1 a;
T2 b;
public:
A(T1 x,T2 y):a(x),b(y){}
T1 fun()
{
cout << a << endl;
return a;
}
void sun(T1 a1,T2 a2);
};
template<typename T1,typename T2>
void A<T1,T2>::sun(T1 a1,T2 a2)
{
a = a1;
b = a2;
}
int main(int argc, char const *argv[])
{
A<int,int> a(3,4); //正确
A<2,4> b(2,4); //错误,类模板<>中不能根据实际数据推导类型
A<int,double> c(3,3.14); //正确
A<int,double> d(3,"swe"); //错误,指定的类型一定要传递相应的数据
return 0;
}
类模板默认参数
可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值。
类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所有模板形参都要设定默认值,比如 template<class T1=int, class
T2>class A{};
就是错误的,因为
T1
给出了默认值,而
T2
没有设定。
T2>class A{};
就是错误的,因为
T1
给出了默认值,而
T2
没有设定。
template<typename T1,typename T2 = int>
class A
{
private:
T1 a;
T2 b;
public:
A(T1 x,T2 y):a(x),b(y){}
};
int main(int argc, char const *argv[])
{
A<int,char> a(3,'3');
A<double> b(3.14,5); //可以只传一个参数
return 0;
}
非类型参数模板
非类型模板形参:
模板的非类型形参也就是内置类型形参
,如:
模板的非类型形参也就是内置类型形参
,如:
template<typename T, int a>
class B{};
其中
int a
就是非类型模板参数。
int a
就是非类型模板参数。
B
<
double
,
6
>
b
;
非类型模板形参的形参和实参间所允许的转换:
1、允许从数组到指针,从函数到指针的转换。如:template <int *a> class A{}; int b[1];
A<b> m;即数组到指针的转换
A<b> m;即数组到指针的转换
5、常规转换。
原文地址:https://blog.csdn.net/jiu_yue_ya/article/details/134613911
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_2105.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。