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
查看全文
相关阅读:
Java实现哥德巴赫猜想
Java实现哥德巴赫猜想
Java实现哥德巴赫猜想
Java实现哥德巴赫猜想
Java实现哥德巴赫猜想
Java实现 洛谷 P1487 陶陶摘苹果(升级版)
Java实现 洛谷 P1487 陶陶摘苹果(升级版)
Java实现 洛谷 P1487 陶陶摘苹果(升级版)
Spring异步任务处理,@Async的配置和使用
Spring Boot系列二 Spring @Async异步线程池用法总结
原文地址:https://www.cnblogs.com/feisky/p/1596203.html
最新文章
美国火星人与中国火星人的本质差别
Ubuntu下很给力的下载工具
Android最新组件RecyclerView,替代ListView
[think in java] 第8章 多态
利用JasperReport+iReport进行Web报表开发
Scheme语言--简单介绍
堆和栈的差别(转过无数次的文章)
Jasper:API / 后向兼容性
Jasper:API / API 策略和最佳做法
开发框架-C#-Web-NFine:.NET快速开发平台 NFine.Framework Web框架
热门文章
软件-数据库-Power Designer:百科
Template-TModJS:使用tmodjs
Nuget:Newtonsoft.Json
Omu.ValueInjecter.StaticValueInjecter.cs
微信公众平台:微信JS-SDK Demo
JS-React:目录
React.js:template
linux服务之rsync
Java实现 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
Java实现 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
Copyright © 2011-2022 走看看