C++程序设计方法4:模板特化
模板参数的具体化/特殊化
有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化”
对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化;
如:
char *sum(char *,char *);
在函数名后用<>括号括起具体类型
template<> char* sum<char*>(char* a,char* b){...}
由编译器推导出具体的类型,函数名为普通形式:
template<> char *sum(char* a ,char *b){}
对于类模板,允许部分特化,即部分限制模板的通用性,如:
//通用模板类
template<class T1,class T2>class A{...};
//部分特化的模板类:第二个类型参数指定为int
template<class T1>class A<T1,int>{...};
若指定所有的类型,则<>内将为空
template<>class A<int,int>{...};
#include <iostream>
using namespace std; template<typename T> T sum(T a, T b)
{
return a + b;
}
//因为是特化,类型已知,所以模板参数列表为空;
template<>
char* sum(char* a, char* b)
{
char* p = new char[strlen(a) + strlen(b) + ];
strcpy(p, a);
strcat(p, b);
return p;
} int main()
{
cout << sum(, ) << " " << sum(5.1, 13.8) << endl;
//调用普通的函数模板
char *str1 = "hello,", *str2 = "world";
//调用特例化的函数模板
cout << sum(str1, str2) << endl; return ;
}
类模板的特化实例:
#include <iostream>
using namespace std; template<typename T>
class Sum
{
T a, b;
public:
Sum(T op1, T op2) :a(op1), b(op2) {}
T DoIt() { return a + b;}
};
//替换T,特例化
template<>class Sum<char*>
{
char *str1, *str2;
public:
Sum(char *s1, char *s2) :str1(s1), str2(s2) {}
char *DoIt()
{
char *tmp = new char[strlen(str1) + strlen(str2) + ];
strcpy(tmp, str1);
strcat(tmp, str2);
return tmp;
}
}; int main()
{
Sum<int> obj1(, );
cout << obj1.DoIt() << endl; char *s1 = "hello", *s2 = "THU";
Sum<char *> obj2(s1, s2);
cout << obj2.DoIt() << endl; return ;
}
C++程序设计方法4:模板特化的更多相关文章
- C++模板特化编程
在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数 ...
- C++模板特化与偏特化
C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然 ...
- C++-函数模板特化如何避免重复定义
我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...
- C++ template —— 模板特化(五)
本篇讲解模板特化-------------------------------------------------------------------------------------------- ...
- C++ 模板特化以及Typelist的相关理解
近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值 ...
- 转:C++模板特化的概念
http://blog.csdn.net/yesterday_record/article/details/7304025 很久没有看C++,在看STL源码剖析时,看到一个function templ ...
- oop &&GP 模板 ---> 特化和偏特化
OOP面向对象编程 GP泛型编程(generic programming) 两者的主要区别就是OOP将数据和对数据的操作放在一起, GP就是将数据和操作独立开来 GP: 数据就是container ...
- c++ 模板特化与局部特化
c++ 模板特化与局部特化 模板的由来是要处理泛化,也就是任何类型都可以处理.但是泛化的同时,如果针对某种特殊的类型,又更加效率的处理方法.c++提供针对特殊的类型,可以定义不同的处理方法.针对某种特 ...
- JavaScript js无间断滚动效果 scrollLeft方法 使用模板
JavaScript js无间断滚动效果 scrollLeft方法 使用模板 <!DOCTYPE HTML><html><head><meta charset ...
随机推荐
- HDU 3294 Girls' research(manachar模板题)
Girls' researchTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- MyBatis配置:在控制台打印SQL语句
1.在spring-mybatis.xml中配置语句 注意:value=”classpath:mybatis-config.xml”这个文件如果之前没有,是需要新建的 2.新建mybatis-con ...
- php函数xml转化数组
/** * xml转数组 * @param $xml * @return array */ function xml_to_array( $xml ) { $reg = "/<(\\w ...
- bzoj3992
题解: 求模素数 p 原根的方法:对 p-1 进行素因子分解,记pi为p-1的第i个因子,若恒有a^((p-1)/pi) mod p ≠ 1 成立,则 a 就是 p 的原根.(对于合数求原根,只需把 ...
- 3. 深入研究 UCenter API 之 加密与解密(转载)
1. 深入研究 UCenter API 之 开篇 (转载) 2. 深入研究 UCenter API 之 通讯原理(转载) 3. 深入研究 UCenter API 之 加密与解密(转载) 4. ...
- linux重启服务的脚本命令
最近做网站测试,每次测试完成都要重启服务,为此写了一个简单的shell脚本 linux服务重启shell脚本示例 2014年12月18日 linux服务重启脚本,如何实现linux服务的定时重启,可以 ...
- nginx+keepalived实现 负载均衡 高可用
Vip: 192.168.220.18 Rip1:192.168.220.2 Rip:192.168.220.3 Rip可以配置在一个服务器上通过ip做虚拟主机 1 rs上配置环境 2 配置应用 Yu ...
- BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS
原文链接http://www.cnblogs.com/zhouzhendong/p/8371735.html 题目传送门 - BZOJ3393 题意概括 直接看原题的翻译吧,很容易懂的. 题解 我不知 ...
- nexus、maven私服仓库(一)
下载地址:http://www.sonatype.com/download-oss-sonatype 将下载好的nexus解压到指定的目录下,我这里使用的是nexus-3.14.0-04-win64 ...
- Badboy录制Jmter脚本
提纲 1.特性和用途 2.下载和安装 3.界面介绍 4.录制脚本(注意:badboy默认是打开就开始录制,需要在step双击后进行取消默认设置) 5.添加断言(参数化设置,注意:badboy默认只运行 ...