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 ...
随机推荐
- SQL Server索引的执行计划
如何知道索引有问题,最直接的方法就是查看执行计划.通过执行计划,可以回答表上的索引是否被使用的问题. (1)包含索引:避免书签查找 常见的索引方面的性能问题就是书签查找,书签查找分为RID查找和键值查 ...
- 修改Tomcat默认连接数
<Connector port=" protocol="HTTP/1.1" connectionTimeout=" redirectPort=" ...
- textarea文本域宽度和高度width及height自动适应实现代码
<HTML> <HEAD> <TITLE>textarea宽度.高度自动适应处理方法</TITLE> <!-- 控制宽度的自动适应 --> ...
- BZOJ3156 防御准备 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8688187.html 题目传送门 - BZOJ3156 题意 长为$n$的序列$A$划分,设某一段为$[i,j] ...
- 简单的线程Thread使用
static void Main(string[] args) { for (int i = 0; i < 5; i++) { aa a = new aa(); a.age = i; Threa ...
- 20165235 祁瑛 2018-3 《Java程序设计》第四周学习总结
20165235 祁瑛 2018-3 <Java程序设计>第四周学习总结 教材学习内容总结 第五单云总结 (一)子类与继承1.java中子类只能有一个父类,在类名前用extends标记.2 ...
- TF:利用TF的train.Saver将训练好的variables(W、b)保存到指定的index、meda文件—Jason niu
import tensorflow as tf import numpy as np W = tf.Variable([[2,1,8],[1,2,5]], dtype=tf.float32, name ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
- POJ 2912 Rochambeau(暴力)+【带权并查集】
<题目链接> 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000),接下来m行形如x, y, ch的输入,ch='='表示x, y平局 ...
- 001. Ansible简介
一 简介 Ansible是一款极其简单的自动化运维工具, 基于Python开发, 集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点. 实现了批量系统 ...