类和函数模板特例化

原创 2016年08月30日 20:37:07

引入原因:编写单一的模板,它能适应大众化,使每种类型都具有相同的功能,但对于某种特定类型,如果要实现其特有的功能,单一模板就无法做到,这时就需要模板特例化。
定义:是对单一模板提供的一个特殊实例,它将一个或多个模板参数绑定到特定的类型或值上。

函数模板特例化:必须为原函数模板的每个模板参数都提供实参,且使用关键字template后跟一个空尖括号对<>,表明将原模板的所有模板参数提供实参。

template<typename T> //函数模板
int compare(const T &v1,const T &v2)
{
    if(v1 > v2) return -1;
    if(v2 > v1) return 1;
    return 0;
}

//模板特例化,满足针对字符串特定的比较,要提供所有实参,这里只有一个T
template<> 
int compare(const char* const &v1,const char* const &v2)
{
    return strcmp(p1,p2);
}

特例化版本时,函数参数类型必须与先前声明的模板中对应的类型匹配,其中T为const char*。

本质:特例化的本质是实例化一个模板,而非重载它。特例化不影响参数匹配。参数匹配都以最佳匹配为原则。例如,此处如果是compare(3,5),则调用普通的模板,若为compare(“hi”,”haha”)则调用特例化版本(因为这个cosnt char*相对于T,更匹配实参类型),注意,二者函数体的语句不一样了,实现不同功能。

注意:普通作用于规则使用于特例化,即,模板及其特例化版本应该声明在同一个头文件中,且所有同名模板的声明应该放在前面,后面放特例化版本。

类模板特例化:原理类似函数模板,不过在类中,我们可以对模板进行特例化,也可以对类进行部分特例化。对类进行特例化时,仍然用template<>表示是一个特例化版本,例如:

template<>
class hash<sales_data>
{
    size_t operator()(sales_data&);
    //里面所有T都换成特例化类型版本sales_data
};

按照最佳匹配原则,若T != sales_data,就用普通类模板,否则,就使用含有特定功能的特例化版本。

类模板的部分特例化:不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个类模板的部分特例化本身仍是一个模板,使用它时还必须为其特例化版本中未指定的模板参数提供实参。此功能就用于STL源码剖析中的traits编程。详见C++primer 628页的例子。(特例化时类名一定要和原来的模板相同,只是参数类型不同,按最佳匹配原则,那个最匹配,就用相应的模板)

特例化类中的部分成员:可以特例化类中的部分成员函数而不是整个类。

template<typename T>class Foo
{
    void Bar();
    void Barst(T a)();
};
template<>
void Foo<int>::Bar()
{
    //进行int类型的特例化处理
}

Foo<string> fs;
Foo<int> fi;//使用特例化
fs.Bar();//使用的是普通模板,即Foo<string>::Bar()
fi.Bar();//特例化版本,执行Foo<int>::Bar()
//Foo<string>::Bar()和Foo<int>::Bar()功能不同
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++学习之模板特例化

模板是C++中一个很重要的特性,写一份代码能用于多种数据类型(包括用户自定义类型)。例如,STL的sort()函数可以用于多种数据类型的排序,类stack可以用作多种数据类型的栈。但是,如果我们想对特...

模板特例化

一个特例化版本就是模板的一个独立的定义,在其中一个或多个模板参数被指定为特定的类型。定义函数模板特例化 当我们特例化一个函数模板时,必须为原模板中的每个模板参数都提供实参。为了指出我们正在实例化一个...
  • tengyft
  • tengyft
  • 2015年04月29日 10:49
  • 901

c++类模板特例化

#include #include using namespace std; template class A { public: A(){cout

[C++]模版特例化和模版偏特化

函数模版特例化例子://第一个版本;可以比较任意两个类型 template int compare(const &T,const T&); //第二个版本处理字符串字面常量;重载实现 template...

C++模板,特例化

我已经制定了一个计划,希望可以定期地在博客上更新文章。我将探讨编译器如何处理模板等这类有意思的事情,并佐以实例。 作为一个编译器开发人员,我倾向于用一些小的例子来显示或者测试编译...

模板的声明和实现为何要放在头文件中?

源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx如何组织编写模板程序 发表日期: 1/21/2003 12:28:58...

【C++11】完美转发的使用

原文 http://blog.csdn.net/aqtata/article/details/35372769 完美转发(perfect forwarding)问题是指函...

整数的Hash函数

一、整数的Hash函数 常用的方法有三种:直接取余法、乘积取整法、平方取中法。下面我们对这三种方法分别进行讨论。以下假定我们的关键字是,Hash表的容量是,Hash函数为 。 1.直接取余法 ...

C++模板特例化

在学习C++相关源代码时,经常会周旋于各种模板及其特例化中,在此对特例化的个人理解加以记录,有错误和不足之处还请大家指正。...

模板类的特例定义

opencv中有一个模板类DataType,该函数定义如下: 该类有自己的模板_Tp,但是如果有某一个类型需要与这个类的内部定义有区别怎么办,可以重新将该类型下的类进行再次定义: 另外,对于模...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类和函数模板特例化
举报原因:
原因补充:

(最多只允许输入30个字)