-
模板特化:就是在实例化模板时,对特定类型的实参进行特殊处理,即实例化一个特殊的实例版本,
-
当以特化定义时的形参使用模板时,将调用特化版本,模板特化分为全特化和偏特化;
-
1. 函数模板的特化,只能全特化;
-
-
-
template <class T> int compare(const T &v1, const T &v2)
-
{
-
if(v1 < v2) return -1;
-
if(v2 > v1) return 1;
-
return 0;
-
}
-
-
对于该函数模板,当实参为两个char指针时,比较的是指针的大小,而不是指针指向内容的大小,此时就需要为该函数模板定义一个特化版本,即特殊处理的版本:
-
-
-
template <> int compare<const char *>(const char * const &v1, const char * const &v2)
-
{
-
return strcmp(v1, v2);
-
}
-
a: template <>
-
b: compare<const char *>
-
c: (const char * const &v1, const char * const &v2)
-
-
-
template <> int compare<const int *>(const int * const &v1, const int * const &v2)
-
{
-
if(*v1 < *v2) return -1;
-
if(*v2 > *v1) return 1;
-
}
-
-
2. 与其他函数声明一样,应该在一个头文件中包含模板特化的声明,在使用特化模板的源文件中包含该头文件;
-
注意,函数模板调用时的实参与模板形参不进行常规转换,特化与泛型版本都不进行常规转换,类型必须完全一致,非函数模板在实参调用时进行常规转换;普通函数和函数模板调用时的实参与模板形参都进行两种转换:
-
(1). const转换:接受const引用或者const指针的函数,可以分别以非const对象的引用或者指针来调用,无需产生新实例,如果函数接受非引用类型或者非指针类型,形参类型和实参类型忽略const,无论传递const还是非const对象给非引用类型的函数,都使用相同的实例;
-
(2). 数组或函数指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规转换,数组转换为指向实参第一个元素的指针,函数实参当做指向函数类型的指针;注意:函数模板中,模板形参表中的非类型形参遵循常规转换原则。
-
-
-
-
-
#include <stdio.h>
-
#include <string.h>
-
#include <iostream>
-
-
-
template <typename T> int compare(const T &v1, const T &v2)
-
{
-
std::cout << "template <typename T>" << std::endl;
-
if(v1 < v2) return -1;
-
if(v2 < v1) return 1;
-
return 0;
-
}
-
-
-
-
template <> int compare<const char *>(const char * const &v1, const char * const &v2)
-
{
-
std::cout << "template <> int compare<const char *>" << std::endl;
-
return strcmp(v1, v2);
-
}
-
-
-
-
template <> int compare<char *>(char * const &v1, char * const &v2)
-
{
-
std::cout << "template <> int compare<char *>" << std::endl;
-
return strcmp(v1, v2);
-
}
-
-
-
#include <iostream>
-
#include "16.6.1.h"
-
using namespace std;
-
int main()
-
{
-
cout << compare(1, 2) << endl;
-
char a[] = {"abc"};
-
const char b[] = {"abc"};
-
char *p = "ddd";
-
char * const pc = "ddd";
-
const char * const pc = "ddd";
-
const char * pc = "ddd";
-
-
-
const char *pa = "abc";
-
const char *pb = "bbd";
-
cout << compare(pa, pb) << endl;
-
-
-
char *pc = "ccc";
-
char *pd = "ddd";
-
cout << compare(pc, pd) << endl;
-
return 0;
-
-
-
}
-
-
运行结果:
-
template <typename T>
-
-1
-
template <> int compare<const char *>
-
-1
-
template <> int compare<char *>
-
-1
模板函数的特化,布布扣,bubuko.com
模板函数的特化
原文:http://blog.csdn.net/nyist327/article/details/38559287