C++14学习笔记(5)——变量模板

模板是C++实现元编程的重要手段,C++的模板有类模板、函数模板,在C++11中引入了类型别名模板。而在C++14中,引入了一种称为变量模板的新的模板类型。

以一段代码为例:
//代码5.1
#include 
#include 
using namespace std;

template 
T var;		//声明变量模板

void assign()	//为模板的相应变量赋值
{
	var = 7;
	var = 3.14;
	var = '$';
	var = "这是一个字符串";
}

void get_address()	//获取模板的相应变量的地址
{
	int* pi = &var;
	double* pd = &var;
	char* pc = &var;
	string* ps = &var;
	cout << pi << " " << pd << " " << static_cast(pc) << " " << ps << endl;
}

void output()	//输出模板的相应变量
{
	cout << var << endl << var << endl << var << endl << var << endl;
}

int main()
{
	get_address();
	output();
	assign();
	get_address();
	output();
	return 0;
}
某一次的运行结果为:
013912E0 013912E8 013912F1 013912F4
0
0

013912E0 013912E8 013912F1 013912F4
7
3.14
$
这是一个字符串

结果分析:
这段代码使用template T var;语句声明了一个(全局的)变量模板,并在assign函数中进行了赋值。由get_address的输出结果可知,var变量模板的四个实例var, var, var, var的地址不同,说明它们是四个不同的变量。使用变量模板的好处和使用函数模板一样,对于需要重复定义用途类似,但类型不同的变量,可以减少重复代码量,不必重复定义形如var_int, var_double...之类的变量。

VC2015要求变量模板必须为全局变量,理论上来说应该可以在全局区对变量模板赋值,但VC2015中对变量模板的赋值不能在全局区域:
//代码5.2
//这段代码放在全局区域
template 
T var;
//在VC2015中报错:缺少类型说明符
var = 5.3f;
编译器给的报错很奇怪,似乎编译器并没有认为var是一个变量模板的实例化变量,但是在函数体内的赋值确是正确的。

你可能感兴趣的:(编程语言)