关于模板
来源:互联网 发布:java聊天室界面代码 编辑:程序博客网 时间:2024/05/20 14:19
注:编译器版本 VS2013;
#ifndef __TEST_H__#define __TEST_H__#include<iostream>#include<string>#include<stdlib.h>using namespace std;#endif
函数模板
#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>T Add(T left, T right){ return left + right;}int Add(int left, int right){ return left + right;}double Add(double left, double right){ return left + right;}int main(){ cout << Add(10, 20) << endl; cout << Add<>(10, 20) << endl; cout << Add(10.1, 20.0) << endl; cout << Add(10, (int)20.0) << endl; cout << Add<int>(10, 20.0) << endl; system("pause"); return 0;}隐式实例化 Add(10,20),通过参数推演出来T的类型,但如果有一个处理int类型的函数,就会直接调用该函数,不会再用模板函数实例化处理int类型的加法函数。Add<>(10,20)必须要模板函数实例化出一个函数,Add(1,'2')像这样无法实例化解决的函数。1:强转a:显式强转Add(10, (int)20.0)b.显式实例化Add<int>(1,'2') 隐士强转,会将字符强转为int。
模板函数重载
模板函数重载#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T> const T& Max(const T& left, const T& right){ return(left > right) ? left : right;}//两个函数模板构成重载template<typename T> const T& Max(const T& left, const T& mid, const T& right){ const T& tmp = Max(left, right); return(tmp > right) ? tmp : right;}int main(){cout << Max(1, 2) << endl;cout << Max(1, 2, 3) << endl;system("pause"); return 0;}
模板函数特化
特化即特殊化,
模板函数特化#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<class T> //1111const T& Max(const T& left, const T& right){ return(left > right) ? left : right;}模板函数特化,必须给出基础版本 template<>const char*& Max<const char*&>(const char*& Pleft, const char*& Pright){ if (strcmp(Pleft, Pright) > 0) { return Pleft; } return Pright;}int main(){ const char* p1 = "hello"; const char* p2 = "word"; cout << Max<const char* &>(p1, p2) << endl; //比较两个地址 //cout << Max("hello", "word") << endl; return 0;}
特化版本和实例化版本的重载
#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>void Func(const T& x){ count << "T" << x << endl;}void Func(const string& s){ cout << "string" << s << endl;//是上面函数模板的特化版本}int main(){ Func(1);//void Func(const int& x) ,实例化出来的函数和上面的特化版本的函数构成函数重载,函数名相同,参数类型不同 Func(string("aaaa")); system("pause"); return 0;}
模板类定义格式及其特化
分为全特化和偏特化;
#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>class MyClass{public: MyClass() { cout << "MyClass(T)" << endl; } ~MyClass() { cout << "~MyClass(T)" << endl; }private: T a;};//模板类特化template<>class MyClass<string>{public: MyClass() { cout << "MyClass(string)" << endl; } ~MyClass() { cout << "~MyClass(string)" << endl; }private: string a;};int main(){ MyClass<int>s1; MyClass<string>s2; system("pause"); return 0;}
#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T1,typename T2>class MyClass{public: MyClass() { cout << "MyClass<T1,T2>" << endl; } ~MyClass() { cout << "~MyClass<T1,T2>" << endl; }private: T1 a1; T2 a2;};template<>class MyClass<int,char>//全特化{public: MyClass() { cout << "MyClass<int,char>" << endl; } ~MyClass() { cout << "~MyClass<int,char>" << endl; }private: int a1; char a2;};template<typename T2>class MyClass<int,T2>//偏特化{public: MyClass() { cout << "MyClass<int,T2>" << endl; } ~MyClass() { cout << "~MyClass<int,T2>" << endl; }private: int a1; T2 a2;};template<typename T1,typename T2>class MyClass<T1*,T2*>//偏特化,参数进一步限制{public: MyClass() { cout << "MyClass<T1*,T2*>" << endl; } ~MyClass() { cout << "~MyClass<T1*,T2*>" << endl; }private: T1 *a1; T2 *a2;};template<typename T1, typename T2>class MyClass<T1&, T2*>//偏特化,{public: MyClass() { cout << "MyClass<T1&,T2*>" << endl; } ~MyClass() { cout << "~MyClass<T1&,T2*>" << endl; }private: T1 a1; T2 a2;};int main(){ MyClass <double, double> m1; MyClass<int,char>m2; MyClass<int,double>m3; MyClass<int*, int*>m4; MyClass<int&, int*>m5; system("pause"); return 0;}
0 0
- 关于模板--模板函数
- 关于模板
- 关于模板
- 关于 模板
- 关于设计文档模板
- 关于joomla模板兼容问题
- 关于joomla模板兼容问题
- 关于模板语言 Mustache
- 关于模板使用
- 关于C++模板
- 关于模板类
- 关于javascript模板
- 关于Freemarker模板编写
- 关于C++中的模板
- 关于模板的思考
- 关于模板缓冲区
- 关于模板template
- 关于前段模板引擎
- BP和RBF神经网络比较
- 触发器ORA-04091 错误
- QWebEngine增加DEBUG模式
- eclipse汉化时报错an internal error occurred during :"Install download"
- 关于dubbo的一切:生态圈
- 关于模板
- Linux 下 go配置环境变量
- centos系统创建开机自启动服务思路
- mac 下nginx安装及使用
- 零基础学Java的方法
- 黄聪:Python+NLTK自然语言处理学习(一):环境搭建
- 【怎样写代码】参数化类型 -- 泛型(二):泛型的优点
- 05 信号与槽
- 回溯算法