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

来源:互联网 发布:单片机里cpu 编辑:程序博客网 时间:2024/05/22 11:32
模板是C++实现元编程的重要手段,C++的模板有类模板、函数模板,在C++11中引入了类型别名模板。而在C++14中,引入了一种称为变量模板的新的模板类型。

以一段代码为例:
//代码5.1#include <iostream>#include <string>using namespace std;template <typename T>T var;//声明变量模板void assign()//为模板的相应变量赋值{var<int> = 7;var<double> = 3.14;var<char> = '$';var<string> = "这是一个字符串";}void get_address()//获取模板的相应变量的地址{int* pi = &var<int>;double* pd = &var<double>;char* pc = &var<char>;string* ps = &var<string>;cout << pi << " " << pd << " " << static_cast<void*>(pc) << " " << ps << endl;}void output()//输出模板的相应变量{cout << var<int> << endl << var<double> << endl << var<char> << endl << var<string> << 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 <typenameT> T var;语句声明了一个(全局的)变量模板,并在assign函数中进行了赋值。由get_address的输出结果可知,var变量模板的四个实例var<int>, var<double>, var<char>, var<string>的地址不同,说明它们是四个不同的变量。使用变量模板的好处和使用函数模板一样,对于需要重复定义用途类似,但类型不同的变量,可以减少重复代码量,不必重复定义形如var_int, var_double...之类的变量。

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

0 0