一 、“函数模板”与“模板函数”

下面几行代码就是一个“函数模板”

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

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

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

  2. C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

    模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...

  3. C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]

    模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: ...

  4. C++程序设计方法4:模板特化

    模板参数的具体化/特殊化 有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化” 对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化: 如: char *s ...

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

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

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

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

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

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

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

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

  9. C++模板特化编程

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

  10. C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

    模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...

随机推荐

  1. python学习笔记一 python入门(基础篇)

    简单介绍一下python2.x和3.5的区别   print   在python3.5中print 变为print() Old: print * New: print( * ) 如果想要不换行,之前的 ...

  2. 如何更改java应用程序标题栏默认图标

    方法一: 如果你用过Toolkit类,这将是一件很简单的事情: Toolkit tk=Toolkit.getDefaultToolkit() Image image=tk.createImage(&q ...

  3. ContentProvider官方教程(2)简介、Content URIs

    In this document Overview Accessing a provider Content URIs Content Provider Basics A content provid ...

  4. java Web应用配置log4j日志记录

    公司启动全国支票影像系统,有这样一个功能是和消息中间件打交道,需要记录每一个报文出错情况,因为方便后期开发人员的调试,我选用了log4j作为日志记录,好了废话不多说了! 第一步:首先建立一个WEB工程 ...

  5. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  6. Android-图片按钮汇总

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  7. CodeForces 148B Escape

    Escape Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  8. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  9. MSChart使用

    制作报表的时候结果出现画红线处的信息太散, 如果没必要全部显示出来,我们可以使用这种效果: 注意和前面的区分,这个功能叫做Collect Pie Slices(收集分区) 要实现此功能,应先了解相关信 ...

  10. 《NoSQL精粹》思维导图读书笔记

    <NoSQL精粹>思维导图读书笔记 各主题笔记 这本书短小精悍,虽不能解答所有NoSQL疑问,但在读书过程中会抛给你不少未曾想过的问题,给人以更深入的思考: 这里对每一个主题分别做了笔记: ...