zoukankan
html css js c++ java
C++模版全掌握(实例)
前段时间重新学习C++,主要看C++编程思想和C++设计新思维。对模版的使用有了更进一层的了解,特总结如下:
下面列出了模版的常用情况:
//
1. 模板类静态成员
template
<
typename T
>
struct
testClass
{
static
int
_data;
}
;
template
<>
int
testClass
<
char
>
::_data
=
1
;
template
<>
int
testClass
<
long
>
::_data
=
2
;
int
main(
void
)
{
cout
<<
boolalpha
<<
(
1
==
testClass
<
char
>
::_data)
<<
endl;
cout
<<
boolalpha
<<
(
2
==
testClass
<
long
>
::_data)
<<
endl;
}
//
2. 模板类偏特化
template
<
class
I,
class
O
>
struct
testClass
{
testClass()
{ cout
<<
"
I, O
"
<<
endl; }
}
;
template
<
class
T
>
struct
testClass
<
T
*
, T
*>
{
testClass()
{ cout
<<
"
T*, T*
"
<<
endl; }
}
;
template
<
class
T
>
struct
testClass
<
const
T
*
, T
*>
{
testClass()
{ cout
<<
"
const T*, T*
"
<<
endl; }
}
;
int
main(
void
)
{
testClass
<
int
,
char
>
obj1;
testClass
<
int
*
,
int
*>
obj2;
testClass
<
const
int
*
,
int
*>
obj3;
}
//
3.类模版+函数模版
template
<
class
T
>
struct
testClass
{
void
swap( testClass
<
T
>&
)
{ cout
<<
"
swap()
"
<<
endl; }
}
;
template
<
class
T
>
inline
void
swap( testClass
<
T
>&
x, testClass
<
T
>&
y )
{
x.swap( y );
}
int
main(
void
)
{
testClass
<
int
>
obj1;
testClass
<
int
>
obj2;
swap( obj1, obj2 );
}
//
4. 类成员函数模板
struct
testClass
{
template
<
class
T
>
void
mfun(
const
T
&
t )
{
cout
<<
t
<<
endl;
}
template
<
class
T
>
operator
T()
{
return
T();
}
}
;
int
main(
void
)
{
testClass obj;
obj.mfun(
1
);
int
i
=
obj;
cout
<<
i
<<
endl;
}
//
5. 缺省模板参数推导
template
<
class
T
>
struct
test
{
T a;
}
;
template
<
class
I,
class
O
=
test
<
I
>
>
struct
testClass
{
I b;
O c;
}
;
void
main()
{
}
//
6. 非类型模板参数
template
<
class
T,
int
n
>
struct
testClass
{
T _t;
testClass() : _t(n)
{
}
}
;
int
main(
void
)
{
testClass
<
int
,
1
>
obj1;
testClass
<
int
,
2
>
obj2;
}
//
7. 空模板参数
template
<
class
T
>
struct
testClass;
template
<
class
T
>
bool
operator
==
(
const
testClass
<
T
>&
,
const
testClass
<
T
>&
)
{
return
false
;
}
;
template
<
class
T
>
struct
testClass
{
friend
bool
operator
==
<>
(
const
testClass
&
,
const
testClass
&
);
}
;
void
main()
{
}
//
8. template template 类
struct
Widget1
{
template
<
typename T
>
T foo()
{}
}
;
template
<
template
<
class
T
>
class
X
>
struct
Widget2
{
}
;
void
main()
{
cout
<<
3
<<
'
\n
'
;
}
//参考:
http://www.cnblogs.com/dayouluo/archive/2005/05/14/155092.html
特别注意:类,全局函数,类的成员函数都可以特化,但是只有类可以半特化,全局函数和类的成员函数不可以半特化。
//
-------------------------------------------
//
1 类的特化和类成员函数的特化
template
<
typename T
>
class
Widget1
{
public
:
void
Fun1()
{
//
generic implementation
}
}
;
template
<>
class
Widget1
<
int
>
{
public
:
void
Fun1()
{
}
}
;
template
<>
void
Widget1
<
char
>
::Fun1()
{
//
specialization
}
void
main()
{
Widget1
<
char
>
w;
w.Fun1();
Widget1
<
int
>
w2;
w2.Fun1();
}
//
-------------------------------------------
//
2 全局函数的特化和重载
template
<
typename T1, typename T2
>
T1 Fun2(T2)
{
}
//
下面2个应该是属于重载
template
<
typename T2
>
char
Fun2(T2)
{
char
c;
return
c;
}
template
<
typename T1
>
T1 Fun2(
char
)
{
}
//
全局函数的特化
template
<>
char
Fun2
<
char
,
int
>
(
int
)
{
char
c;
return
c;
}
int
main()
{
}
//
-------------------------------------------
//
3 全局函数不能半特化,以下编译失败
template
<
typename T1,typename T2
>
//
原型1
void
Test(T1,T2)
{
}
template
<
typename T1
>
void
Test
<
T1,T1
>
(T1,T1)
{
}
template
<
typename T1, typename T2
>
//
原型2
T1 Fun2(T2)
{
}
//
template
<
typename T2
>
int
Fun2
<
int
,T2
>
(T2)
{
}
template
<
typename T1
>
T1 Fun2
<
T1,
int
>
(
int
)
{
}
template
<
typename T
>
T Fun2
<
T,T
>
(T)
{
}
int
main()
{
}
///
/-------------------------------------------
///
/4 类可以特化和半特化,但是特的成员函数像全局函数一样,只能特化,不能半特化,
template
<
typename T1, typename T2
>
struct
Widget2
{
void
Fun2()
{
//
generic implementation
}
}
;
template
<
typename T2
>
struct
Widget2
<
char
,T2
>
{
void
Fun2()
{
}
}
;
template
<
typename T2
>
struct
widget2
{
void
Fun2()
{
//
class partial specialization
}
}
;
//
the class member funtion can not be partial specialization
//
以下的成员函数半特化,编译失败
template
<
typename T2
>
void
Widget2
<
char
, T2
>
::Fun2()
{
//
class member function partial specialization
}
int
main()
{
}
参考:C++编程思想2
http://www.cppblog.com/woaidongmao/archive/2008/09/14/61795.html
查看全文
相关阅读:
[管理]管理者应需要知道的一些定律
推荐IOS Moneky测试工具Fast Monkey
[原创]强烈推荐Cmd终极替换工具Cmder
[原创] 2018年测试行业各职位薪水参考表
[原创]管理者如何激励下属更有效的工作?
[原创]SonarQube代码质量检查工具介绍
[原创]F2etest是一个面向前端、测试、产品等岗位的多浏览器兼容性测试整体解决方案。
[原创] IMB AppScan 9.0下载及破解
[原创] Influxdb+Grafana+Jmeter性能监控工具搭建
[原创]浅谈互联网金融接口测试平台搭建
原文地址:https://www.cnblogs.com/feisky/p/1596203.html
最新文章
Airtest网易开源的一款UI自动化测试工具
BAT公司职级体系及薪水解密
《增长黑客》一书思维导图
[原创]一图了解互联网环境分类
[原创]浅谈携程阿波罗配置中心
[原创]Robo 3T 1.2.1 工具使用介绍
[原创]Studio 3T mogodb数据库工具使用介绍
[原创]RedisDesktopManager工具使用介绍
[原创]AndroBugs_Framework Android漏洞扫描器介绍
[原创]移动安全测试框架MobSF介绍
热门文章
[赶集网] 【MySql】赶集网mysql开发36条军规
[原创]上海招聘高级测试工程师(性能测试/自动化测试/App测试),长期有效
[原创]Android Monkey 在线日志分析工具开发
[原创]浅谈我们需要灰度发布吗?
[原创] Selenium包下载及Selenium百度网盘下载
[原创]上海招测试工程师
[原创]浅谈我们应招聘应届毕业生做测试吗?
[原创]微信群中国测试经理总监圈,再次开放,需要加入的加我微信
[推荐]yapi环境搭建
[原创]python+unittest+requests+HTMLTestRunner+jenkins+git+github环境搭建
Copyright © 2011-2022 走看看