C++模板特化
一 、“函数模板”与“模板函数”
下面几行代码就是一个“函数模板”
template <class T>
T abs(T x)
{
return x < 0 ? -x : x;
}
根据“函数模板”可以生成不同的函数,这些“实例化”的函数被称之为“模板函数”。
如:abs(0.1f); 编译器将根据函数模板生成模板函数abs<float> ,并调用abs<float>(0.1f)
如:abs(0.1); 编译器将根据函数模板生成模板函数abs<double>,并调用abs<double>(0.1)
二、函数模板的特例化
template <>
const char* abs<const char*>(const char*s)
{
if(s && s[0] == '-')
{
return s + 1;
}
return NULL;
}
代码 abs("-5") 将调用特化后的 abs<const char*> 函数。
三、函数模板的匹配
template <class T>
T abs(T x)
{
return x < 0 ? -x : x;
}
int abs(int x)
{
return x < 0 ? -x : x;
}
代码 abs(1) 将调用 abs,而不是模板函数 abs<int>,也就是说:非模板函数具有优先权
下面再考虑函数模板被特化后的匹配问题:增加如下代码
template <>
int abs<int>(int x)
{
return x < 0 ? -x : x;
}
同样的代码 abs(1),将调用什么呢?答案是:不确定。具体来说,对于 VC++6.0 而言,abs
函数和模板函数 abs<int> 被当做同一函数,谁先定义谁就有效。对于 VC++2008 而言,abs
函数和模板函数 abs<int> 是两个函数,但 abs 的优先级高于 abs<int>。
总结:对于VC++2008而言,始终是非模板函数具有优先权。对于VC++6.0而言,函数模板被
特化时要特别小心。
四、 类模板与特化
下面是一个类模板的例子
template <class T1,class T2>
class CTest
{
public:
T1 m_a;
T2 m_b;
};
1、全特化
template <>
class CTest<int,double>
{
public:
T1 m_a; //编译器自动将 T1 替换为 int
T2 m_b; //编译器自动将 T2 替换为 double
};
2、偏特化(VC++6.0 至 VC++2003不支持偏特化)
template <class T1>
class CTest<T1,int>
{
public:
T1 m_a;
int m_b; //这里不能再使用 T2
};
五、成员函数模板、模板成员函数、特化
class CTest
{
public:
template<class T>
T Add(T x) const
{//成员函数模板
return (T)m_a + x;
};
public:
int m_a;
};
CTest::Add 就是一个成员函数模板,编译器将根据不同的参数生成不同的模板成员函数。
下面是成员函数模板的特化:
class CTest
{
public:
template<class T>
T Add(T x) const
{
return (T)m_a + x;
};
template<>
double Add<double>(double x) const
{//这个就是特化后的成员函数
return (double)m_a + x;
};
public:
int m_a;
};
VC++6.0 不允许特化成员函数模板的声明、定义分离,如下面的代码在 VC++6.0 里无法编译
class CTest
{
public:
... ... ...
template<>
double Add<double>(double x) const; //特化函数声明
... ... ...
};
//特化函数实现
template<>
double CTest::Add<double>(double x) const;
{
return (double)m_a + x;
};
C++模板特化的更多相关文章
- C++-函数模板特化如何避免重复定义
我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...
- C++ Primer 学习笔记_84_模板与泛型编程 --模板特化
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...
- C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]
模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: ...
- C++程序设计方法4:模板特化
模板参数的具体化/特殊化 有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化” 对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化: 如: char *s ...
- 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++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...
随机推荐
- jquery easyui中文培训文档
目 录 1.... Accordion(可折叠标签)... 2 1.1 实例... 2 1.2 参数... 3 2.... DateBox(日期框)... 4 2 ...
- 2016年12月5日 星期一 --出埃及记 Exodus 20:26
2016年12月5日 星期一 --出埃及记 Exodus 20:26 And do not go up to my altar on steps, lest your nakedness be exp ...
- PHP 之 FastCGI 与 mod_php 详解
背景 PHP最常用的方式是以模块的方式(mod_php)运行在Apache中,也是Apache运行PHP的默认方式:但在Nginx中,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是个什么 ...
- Linux常用性能检测命令解释
1.uptime [root@smgsim02 ~]# uptime 15:08:15 up 98 days, 4:19, 2 users, load average: 0.07, 0.29, 0.1 ...
- zookeeper系列之十—zookeeper数据模型
团队博客:http://rdc.taobao.com/team/jm/archives/tag/zookeeper <ZooKeeper快速搭建>http://nileader.blog. ...
- SQLServer使用表值参数,高性能批量插入数据
记得前段时间帮同事写了个解析账号并入库的小工具,来批量导入账号信息,账号量相当大,程序每读取一条记录便执行一次insert来插入数据,整整跑了一下午才把账号全部入库. 今天又接到同事类似的需求,不过这 ...
- 不要温柔地走入promise
第一步 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...
- SQL查询语句 group by后, 字符串合并
合并列值 --******************************************************************************************* 表 ...
- 微信公众平台开发详细步骤与java代码
1.微信公众平台设置 首先在https://mp.weixin.qq.com/注册一个公众平台账号(服务号.订阅号.企业号的区别) 微信公众平台地址:https://mp.weixin.qq.com ...
- linux安装phpstorm出现 Startup Error: Unable to detect graphics environment
在centos6.2下在安装phpstorm下遇到 Startup Error: Unable to detect graphics environment 其中jdk安装的版本是 1.7.0_79 ...