Loading... # 一、变量模板:Variable Templates。C++14新标准中引入的(一般放在.h头文件中) > **从感觉上,变量模板与函数模板有些类似,看起来象一个没有参数,但是有返回值的函数模板**。 **三种零初始化方式**(T表示一个类型) a)T(); //比如int temp1 = int(); b)T t = {}; //比如 int temp2 = {}; c)T {}; //比如int temp3 = int{}; ```jsx #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; } ``` 结果分析: 这段代码使用template <typenameT> T var; 语句声明了一个(全局的)变量模板,并在assign函数中进行了赋值。由get\_address的输出结果可知,var变量模板的四个实例var<int>, var<double>, var<char>, var<string>的**地址不同**,**说明它们是四个不同的变量**。`使用变量模板的好处和使用函数模板一样,对于需要重复定义用途类似,但类型不同的变量`,可以减少重复代码量,不必重复定义形如var\_int, var\_double...之类的变量。 参考: [https://blog.csdn.net/MgcosA/article/details/53463546](https://blog.csdn.net/MgcosA/article/details/53463546) # 二、变量模板的特化 ## 1、变量模板的全特化 变量模板特化的时候,并不需要正在特化的类型(double)与这个变量模板的类型(char)保持一致。 ## 2、变量模板的偏特化 默认模板参数 非类型模板参数 变量模板的另一种形式 成员变量模板 ```cpp namespace _nmsp1 { //g_myvar的泛化版本 template<typename T> T g_myvar{};//写成T g_myvar =0;也不会出现语法错误,但该写法一般只适合数值类型 //{}是一种对变量的初始化方式,叫做零初始化。何为零初始化:int = 0,指针=nullptr,bool = false 如果是局部变量的话,就是任意值 //全特化 template<> char g_myvar<double>{}; //偏特化 template<typename T> T g_myvar<T*>{120}; //要求T*必须依赖于T //T g_myvar<double*>{120};//编译不过 } namespace _nmsp2 { //g_myvar的泛化版本 template<typename T = int> T g_myvar; } namespace _nmsp3 { template<typename T,int value> T g_myvar[value]; } namespace _nmsp4 { template <typename T> struct B { const static T value = { 160 }; //const也可以写成constexpr,{}也可以不加 }; template <typename T> int g_myvar4 = B<T>::value; //注意g_myvar4是个变量模板 } int main() { int q={}; int temp1 = int(); int temp2 = {}; int temp3 = int{}; _nmsp1::g_myvar<float> = 15.6f; _nmsp1::g_myvar<int> = 13; cout << _nmsp1::g_myvar<float> << endl; cout << _nmsp1::g_myvar<int> << endl;*/ /* _nmsp1::g_myvar<double> = '2'; //这个使用的就是刚刚特化版本的g_myvar变量模板 cout << _nmsp1::g_myvar<double> << endl; printf("%d\\n", _nmsp1::g_myvar<double>);*/ /*cout << _nmsp1::g_myvar<int*> << endl; cout << _nmsp1::g_myvar<int> << endl;*/ /* _nmsp2::g_myvar<int> = 13; _nmsp2::g_myvar<> = 26; //尖括号不能省略,_nmsp2::g_myvar<>等价于_nmsp2::g_myvar<int> cout << _nmsp2::g_myvar<int> << endl; cout << _nmsp2::g_myvar<> << endl;*/ /* for (int i = 0; i < 15; ++i) //i = 0~14 { _nmsp3::g_myvar<int,15>[i] = i; //注意[]中的下标数字<=14,否则下标会越界。 //g_myvar<int,15>写法一出现就表示定义了g_myvar<int,15>[15]这个大小为15个元素的int类型数组。 } for (int i = 0; i < 15; ++i) { cout << _nmsp3::g_myvar<int, 15>[i] << endl; }*/ /* cout << _nmsp4::g_myvar4<int> << endl; //160,g_myvar4<int>相当于B<int>::value _nmsp4::g_myvar4<int> = 152; cout << _nmsp4::g_myvar4<int> << endl; //152 cout << _nmsp4::B<int>::value << endl; //160 */ return 0; } ``` # 三、成员变量模板 ```cpp template <typename T> class D { public: template <typename W> static W m_tpi; //静态成员变量模板声明 }; template <typename T> template <typename W> W D<T>::m_tpi = 5; //定义 int main() { cout << D<float>::m_tpi<int> << endl; D<float>::m_tpi<int> = 150; cout << D<float>::m_tpi<int> << endl; return 0; } ``` 最后修改:2025 年 06 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏