`
blogfeifei
  • 浏览: 1188094 次
文章分类
社区版块
存档分类
最新评论

模板及模板特化

 
阅读更多

模板特化和偏特化

1.引言

C++中的模板分为类模板和函数模板

2.模板的定义

(1) 类模板

定义一个栈的类模板,它可以用来容纳不同的数据类型

说明如下:

template <class T>
class stack {
private:
list* top;

public:
stack();
stack(const stack&);
~stack();
void push(T&);
T& pop();
//…
};

类模板的使用除了要在声明时指明模板参数外,其余均与普通的类相同

(2) 函数模板

template<class T>
T mymax(const T& t1,const T& t2)
{ return t1 < t2 ? t2 : t1; }

template <class T>的意义与类模板定义中相同。

模板函数的使用与普通非模板函数使用相同

3.模板的特化

(1)类模板特化

有时为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理.例如,stack类模板针对bool类型,因为实际上bool类型只需要一个二进制位,就可以对其进行存储,使用一个字或者一个字节都是浪费存储空间的.

template <class T>
class stack {};

template < >
class stack<bool> { //…// };

上述定义中template < >告诉编译器这是一个特化的模板。

(2) 函数模板的特化
看下面的例子
main()
{
int highest = mymax(5,10);
char c = mymax(‘a’, ’z’);
const char* p1 = “hello”;
const char* p2 = “world”;
const char* p = mymax(p1,p2);
}

前面两个mymax都能返回正确的结果.而第三个却不能,因为,此时mymax直接比较两个指针p1 和 p2 而不是其指向的内容.

针对这种情况,当mymax函数的参数类型为const char* 时,需要特化。

template <class T>
T mymax(const T t1, const T t2)
{
return t1 < t2 ? t2 : t1;
}

template <>
const char* mymax(const char* t1,const char* t2)
{
return (strcmp(t1,t2) < 0) ? t2 : t1;
}

现在mymax(p1,p2)能够返回正确的结果了。

4.模板的偏特化

模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化

(1) 类模板的偏特化

例如c++标准库中的类vector的定义

template <class T, class Allocator>
class vector { // … // };

template <class Allocator>
class vector<bool, Allocator> { //…//};

这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。

(2) 函数模板的偏特化

严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。

template <class T> void f(T); (a)

根据重载规则,对(a)进行重载

template < class T> void f(T*); (b)

如果将(a)称为基模板,那么(b)称为对基模板(a)的重载,而非对(a)的偏特化。

5.模板特化时的匹配规则

(1) 类模板的匹配规则

最优化的优于次特化的,即模板参数最精确匹配的具有最高的优先权

例子:

template <class T> class vector{//…//}; // (a) 普通型
template <class T> class vector<T*>{//…//}; // (b) 对指针类型特化
template <> class vector <void*>{//…//}; // (c) 对void*进行特化

每个类型都可以用作普通型(a)的参数,但只有指针类型才能用作(b)的参数,而只有void*才能作为(c)的参数

(2) 函数模板的匹配规则

非模板函数具有最高的优先权。如果不存在匹配的非模板函数的话,那么最匹配的和最特化的函数具有高优先权

例子:

template <class T> void f(T); // (d)
template <class T> void f(int, T, double); // (e)
template <class T> void f(T*); // (f)
template <> void f<int> (int) ; // (g)
void f(double); // (h)
bool b;
int i;
double d;
f(b); // 以 T = bool 调用 (d)
f(i,42,d) // 以 T = int 调用(e)
f(&i) ; // 以 T = int* 调用(f)
f(d); // 调用(g)

分享到:
评论

相关推荐

    数组特化模板类

    泛型容器的设计实现大多只是存储了类型的单个对象,而没有存储类型的多个对象,如果有这样特定的需求,容器内的元素要求都是某个类型的多个对象,那么这时就可以考虑用模板类的数组特化来实现了

    C++模版特化

    说起C++的模板及模板特化, 相信很多人都很熟悉,但是说到模板特化的几种类型, 相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一 是特化为绝对类型; 二是特化为引用,指针类型;...

    深入分析C++模板特化与偏特化

    1.模板特化 1.1概述 模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。 1.2函数...

    模板的 主版本模板类、全特化、偏特化

    模板的 主版本模板类、全特化、偏特化

    C++模板特化匹配规则

    C++模板特化匹配规则

    C++模板之特化与偏特化详解

    对于C++模板特化和偏特化,对于别人来说,已经不是什么新东西了,但是对于我来说,的确是我的盲区,那天在群里讨论这个问题,自己对于这部分确实没有掌握,又联想到在《STL源码剖析》一书中,对于此也是有着介绍。...

    C++ 类模板、函数模板全特化、偏特化的使用

    一、类模板全特化、偏特化 #pragma once #include #include template class TC { public: TC() { std::cout &lt;&lt; "泛化版本构造函数" &lt; class TC { public: TC() { std::cout &lt;&lt; "全特化版本...

    C++模板编程中只特化模板类的一个成员函数

    模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部...

    函数模板完全特化 C++ Builder 示例

    函数模板完全特化 C++ Builder 示例 代码参考: 余文溪的《C++ STL --数据结构与算法实现》原书代码为控制台。 这里用 C++ Builder代码演示

    C++中有关模板的试题题型练习题

    C++模板类型题型,更全面,也可以更从中了解模板的运用与技术。

    C++第59课–类模板深度剖,类模板的特化,函数模板的特化

    实验2:特化的深入理解:函数模板的完全特化 实验1:类模板的特化 #include #include using namespace std; template class Test { public: void add(T1 a, T2 b) { cout &lt;&lt; void add(T1 a, T2 b) &lt...

    枚举声明,模板函数特化

    我读过了您2005年4月的文章:“Wrappers: Use Our ManWrap Library to Get the Best of .NET in Native C++ Code”,文章中没有提供 DumpEnum 程序。...关键字:enum,template,function,specialization,枚举,模板,特化

    c++模板学习记录(自己)

    C++模板学习记录 模板定义 模板使用 类模板 函数模板 特化模板 编译器

    c++模板笔记

    模板的“特化”(实例化),它发生在编译期,无论一个模板被实例化多少次,都不会影响最终结果,但是这会浪费编译的时间.不知道隐式特化是啥东西.但是显式特化的意思是:当一类东西中出了一渣滓的时候,为了对外接口的...

    在C++泛型编程中如何只特化类的某个成员函数

    我们知道在C++模板编程中如果我们特化或是偏特化某个模板类, 我们需要重写整个模板类中的所有函数, 但是这些代码通常是非常相似的, 甚至在某些情况下可能只有一两个函数会不一样,其他函数都是一样的。...

    类模板完全特化 C++ Builder演示

    编译环境: Windows 7 Service Pack 1 C++ Builder Embarcadero RAD Studio XE Version 15.0.3890.34076 代码参考: 余文溪的《C++ STL --数据结构与算法实现》原书代码为控制台。 这里用 C++ Builder代码演示

    C++定义函数模板代码,可以编写通用的函数来处理多种类型的容器

    除了一般的函数模板外,代码还包含了一个函数模板特化。特化是对函数模板的一种特殊处理,用于处理特定类型的情况。在这个示例中,我们特化了函数模板 findMax(),用于处理 std::string 类型的容器。特化版本的函数...

Global site tag (gtag.js) - Google Analytics