模板参数的具体化/特殊化

有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化”

对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化;

如:

  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:模板特化的更多相关文章

  1. C++模板特化编程

    在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数 ...

  2. C++模板特化与偏特化

    C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然 ...

  3. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  4. C++ template —— 模板特化(五)

    本篇讲解模板特化-------------------------------------------------------------------------------------------- ...

  5. C++ 模板特化以及Typelist的相关理解

    近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值 ...

  6. 转:C++模板特化的概念

    http://blog.csdn.net/yesterday_record/article/details/7304025 很久没有看C++,在看STL源码剖析时,看到一个function templ ...

  7. oop &&GP 模板 ---> 特化和偏特化

    OOP面向对象编程 GP泛型编程(generic programming) 两者的主要区别就是OOP将数据和对数据的操作放在一起, GP就是将数据和操作独立开来 GP:   数据就是container ...

  8. c++ 模板特化与局部特化

    c++ 模板特化与局部特化 模板的由来是要处理泛化,也就是任何类型都可以处理.但是泛化的同时,如果针对某种特殊的类型,又更加效率的处理方法.c++提供针对特殊的类型,可以定义不同的处理方法.针对某种特 ...

  9. JavaScript js无间断滚动效果 scrollLeft方法 使用模板

    JavaScript js无间断滚动效果 scrollLeft方法 使用模板 <!DOCTYPE HTML><html><head><meta charset ...

随机推荐

  1. ServerSocket实现超简单HTTP服务器

    1.相关知识简介 HTTP协议 HTTP是常用的应用层协议之一,是面向文本的协议.HTTP报文传输基于TCP协议,TCP协议包含头部与数据部分,而HTTP则是包含在TCP协议的数据部分,如下图 HTT ...

  2. Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077

    1:启动Spark Shell,spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序. 启动Spark Shell, ...

  3. Socket.Io+HttpWebRequest 请求Api

    Socket 接收代码 <html> <head> <title>Socket Client Demo</title> <script src=& ...

  4. 3998: [TJOI2015]弦论

    题解: 每个点的size值就是这个从根-它出现的次数 如果相同只算一次就全部赋值为1就可以了 代码: #include <bits/stdc++.h> #define ll long lo ...

  5. 3.ELK 之elasticsearch CRUD

    名词介绍 index: type: document: 数据类型: 索引(index)创建示例 .   type的创建(7.x之后)将会去掉该内容,点我看为什么? 参考脚本: mapping使用 其他 ...

  6. C# 之 串口数据侦听的实现

    当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令.在C#平台上,可以通过 System.IO.Ports 命名空间下的SerialPort ...

  7. C# 之 反射性能优化2

    问题回顾 在上篇博客中,我介绍了优化反射的第一个步骤:用委托调用代替直接反射调用. 然而,那只是反射优化过程的开始,因为新的问题出现了:如何保存大量的委托? 如果我们将委托保存在字典集合中,会发现这种 ...

  8. WebApi接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...

  9. Django时区的解释

    https://segmentfault.com/q/1010000000405911

  10. du -h排序

    du -sh * du -s /tmp/*|sort -nr|head -3