c++模版
2016-03-01 10:37
239 查看
C++ 模板一般形式为 :
template<typename T>
T func(T a);
调用时式样 func<T> (inputNumber );
func<T> 作为一个整体
参考网站:http://c.biancheng.net/cpp/biancheng/view/213.html
可以 定义一个模板类:
template <typename T1, typename T2>
class UserDefine
{
public:
T1 value1;
template <typename T3>
T2 function1(T3 input)
{
value1 = input;
}
template <typename T4, typenameT5>
T1 function2(T4 input1, T2 input2);
}
类外实现T1
template<typename T1, typename T2> template<typename T4, typename T5>
T1 UserDefine<T1,T2>::function2(T4,input1, T2 input2)
{
value1 = input1 + input2;
return value1;
}
总结:模板在C++中的用一般格式是将函数名 加了一个<>,如func<>, 同时在申明时以template关键字作区分。但是需要注意的是大致地可以分为如下几类:
1) 不属于任何类的函数模板。使用这类特点的模板时,需要注意的是函数名后应该紧跟<>,如
template <typename T1, typename T2>
T1 function(T1 input1, T2 input2);
调用时仅需注意输入参数的合法性:
T1 a = 1;
T2 b = 3;
T1 c = function(a, b);
而事实上,函数模板的调用规范的形式应该是函数名加尖括号的形式(其中尖括号内的参数决定传入参数的类型):function<int, double>(param1,param2); param1和param2的类型会根据<>内的类型指定首先做一次强制类型转换。在很多场合<>可以省去,看起来就和调用普通函数一样,此时T1,T2的类型是编译器自动根据输入的参数类型确定,如果不符合则会报错;另外一种情况则是输入参数无法指定模板中的T:如
template <typename T1>
T1 function(int param1);
调用这个函数时,如果不在尖括号内显式地指出数据类型,则编译器无法确定数据类型,报错。正确的调用方法是int a = 10;
function<double>(a);
参考网站:http://www.prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php (这个网站中有些讲解并不完全正确)
2) 模板类中不含带有自身模板的函数
模板类,题外话,定义完类一定要在括号后加一个分号。
这类函数在类中实现的时候,与普通函数一样;在类外实现的时候,需要在类名后加上类似<T>的形式,如: T firstClass<T>::yourFunction();
3) 模板类中含带自身模板的函数
函数在类外实现时,注意类和自身的template都需要指定,如template<typename T1>, template <typename T2> ,实现为如下形式:T1myClass<T>::myFunction(); 调用时跟单独函数一样,如果不能指定参数,则需要手动指定,形式为p->myFunction<int>(); 若编译器能识别,则无需手动指定,形式形如:T1myClass<T>::myFunction(T1 param1), 则调用时,如下形式是可行的:int a =10; p->myFunction(a);
4) 非模板类中带自身模板的函数
这类成员函数自身带模板,但其所在的类不带模板,因此在类外申明的时候,类名不需要加<>, 形式为T1 myClass::myFunction(T1 param1);
template<typename T>
T func(T a);
调用时式样 func<T> (inputNumber );
func<T> 作为一个整体
参考网站:http://c.biancheng.net/cpp/biancheng/view/213.html
可以 定义一个模板类:
template <typename T1, typename T2>
class UserDefine
{
public:
T1 value1;
template <typename T3>
T2 function1(T3 input)
{
value1 = input;
}
template <typename T4, typenameT5>
T1 function2(T4 input1, T2 input2);
}
类外实现T1
template<typename T1, typename T2> template<typename T4, typename T5>
T1 UserDefine<T1,T2>::function2(T4,input1, T2 input2)
{
value1 = input1 + input2;
return value1;
}
总结:模板在C++中的用一般格式是将函数名 加了一个<>,如func<>, 同时在申明时以template关键字作区分。但是需要注意的是大致地可以分为如下几类:
1) 不属于任何类的函数模板。使用这类特点的模板时,需要注意的是函数名后应该紧跟<>,如
template <typename T1, typename T2>
T1 function(T1 input1, T2 input2);
调用时仅需注意输入参数的合法性:
T1 a = 1;
T2 b = 3;
T1 c = function(a, b);
而事实上,函数模板的调用规范的形式应该是函数名加尖括号的形式(其中尖括号内的参数决定传入参数的类型):function<int, double>(param1,param2); param1和param2的类型会根据<>内的类型指定首先做一次强制类型转换。在很多场合<>可以省去,看起来就和调用普通函数一样,此时T1,T2的类型是编译器自动根据输入的参数类型确定,如果不符合则会报错;另外一种情况则是输入参数无法指定模板中的T:如
template <typename T1>
T1 function(int param1);
调用这个函数时,如果不在尖括号内显式地指出数据类型,则编译器无法确定数据类型,报错。正确的调用方法是int a = 10;
function<double>(a);
参考网站:http://www.prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php (这个网站中有些讲解并不完全正确)
2) 模板类中不含带有自身模板的函数
模板类,题外话,定义完类一定要在括号后加一个分号。
这类函数在类中实现的时候,与普通函数一样;在类外实现的时候,需要在类名后加上类似<T>的形式,如: T firstClass<T>::yourFunction();
3) 模板类中含带自身模板的函数
函数在类外实现时,注意类和自身的template都需要指定,如template<typename T1>, template <typename T2> ,实现为如下形式:T1myClass<T>::myFunction(); 调用时跟单独函数一样,如果不能指定参数,则需要手动指定,形式为p->myFunction<int>(); 若编译器能识别,则无需手动指定,形式形如:T1myClass<T>::myFunction(T1 param1), 则调用时,如下形式是可行的:int a =10; p->myFunction(a);
4) 非模板类中带自身模板的函数
这类成员函数自身带模板,但其所在的类不带模板,因此在类外申明的时候,类名不需要加<>, 形式为T1 myClass::myFunction(T1 param1);
相关文章推荐
- android并发网络请求的处理
- PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法
- python之面向对象
- Go语言三大框架点评
- SonarQube EXECUTION FAILURE
- 音视频(色深)
- iOS开发 automaticallyAdjustsScrollViewInsets 属性设置
- Android EventBus 3.0 框架
- Java +spring MVC 后台图片流在前台页面显示
- 寒哥细谈之AutoLayout全解
- Android 命名规范 (提高代码可以读性)
- CAAnimation-CAPropertyAnimation-CABasicAnimation-CAKeyframeAnimation
- javaweb笔记分享
- sql导出excel
- java-树形json对象
- c++ 11 lamda表达式
- [WPF编程]WPF程序内使用MFC框架
- 如何查看 Mac os 的系统是32bit 还是64bit 的?
- 批处理bat文件若干例子
- 汇编学习笔记之实模式/保护模式区别