《C++ Templates》模板术语

关于类模板和模板类得区分问题:

个人认为主要是针对于翻译的相关问题:即 class template 和 template class的相关问题;

class template“类模板”主要是针对于参数化的类模板描述,即最初的某个类类型的模板定义;

template class“模板类”主要是针对于模板实例化的类,即对某个模板进行实例化的结果,抑或是具有template-id的类;

函数模板/模板函数,成员函数模板/模板成员函数的关系也类似于此;

 

 

关于模板特化的问题:

之前对模板特化有一个误解,一直以为其是针对于模板实例化而进行特化,直到看到书上的描述很疑惑,上网检索才知道是其实是针对于模板类的重载。

例如,对于全特化,有下述形式:

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;

template <typename T, typename U> class myclass {
public:
	T a;
	U b;
	myclass(T v, U u) :a(v), b(u) {};
	void output() {
		cout << "this is orgin template" << endl;
	}
};

template <> class myclass<string, float> {
public:
	string a;
	float b;
	myclass(string v, float u) :a(v), b(u) {};
	void output() {
		cout << "this is special template" << endl;
	}
};

int main() {
	string a = "213";
	myclass<string,float> m(a, 5.5);
	m.output();
	myclass<int, int> n(1, 1);
	n.output();
	system("pause");
	return 0;
}

从上述描述可以看出来,针对于myclass不同参数类型,output()生成的结果是不一样的;

《C++ Templates》模板术语

 

 因此,特化可以看作是针对于类模板的一种重载,不同的模板参数形式可以有不同的定义;

 

关于模板参数、模板实参、template-id的问题:

模板参数:即模板定义尖括号给出的类型,如下图所示;

《C++ Templates》模板术语

 

模板实参:即实际使用时候给出的类型,template-id指的就是所有的模板实参;

《C++ Templates》模板术语

 

上一篇:AutoResetEvent简单理解


下一篇:类和对象—继承—同名成员处理