变量模板与成员变量模板
- 变量模板:Variable Templates。C++14新标准中引入的(一般放在.h头文件中)
template<typename T> T g_myvar{};
- 调用:
g_myvar<float> = 15.6f; g_myvar<int> = 13; cout << g_myvar<float> << endl cout << g_myvar<int> << endl;
- 输出:
15.6 13
- 从感觉上,变量模板与函数模板有些类似,看起来象一个没有参数,但是有返回值的函数模板。
- T g_myvar{}; 写成T g_myvar =0;也不会出现语法错误,但该写法一般只适合数值类型
- {}是一种对变量的初始化方式,叫做零初始化。
- int = 0,指针=nullptr,bool = false
char* p{}; nullptr int q{}; 0 char* p; int q; char* p = {}; nullptr int q={}; 0
- 三种零初始化方式(T表示一个类型)
- T(); //比如int temp1 = int();
- T t = {}; //比如 int temp2 = {};
- T {}; //比如int temp3 = int{};
int temp1 = int(); 0 int temp2 = {}; 0 int temp3 = int{}; 0
变量模板的特化
- 变量模板的全特化
g_myvar的泛化版本 template<typename T> T g_myvar{};
全特化 template<> char g_myvar<double>{};
- 变量模板特化的时候,并不需要正在特化的类型(double)与这个变量模板的类型(char)保持一致。
- 调用:
g_myvar<double> = '2'; //这个使用的就是刚刚特化版本的g_myvar变量模板 cout << g_myvar<double> << endl; printf("%d\n", g_myvar<double>);
- 输出:
2 50
- 变量模板的偏特化
g_myvar的泛化版本 template<typename T> T g_myvar{110};
偏特化 template<typename T> T g_myvar<T*>{120}; 这种写法:T g_myvar<double*>{120}; 错误
- 要求T*必须依赖于T
- 调用:
cout << g_myvar<int*> << endl; cout << g_myvar<int> << endl;
- 输出:
120 110
- 默认模板参数
g_myvar的泛化版本 template<typename T = int> T g_myvar;
- 调用:
g_myvar<int> = 13; g_myvar<> = 26; 尖括号不能省略,_nmsp2::g_myvar<>等价于_nmsp2::g_myvar<int> cout << g_myvar<int> << endl; cout << g_myvar<> << endl;*/
- g_myvar<int>与g_myvar<>相当于是一个变量,输出:
26 26
- 非类型模板参数
template<typename T,int value> T g_myvar[value];
- 调用:
for (int i = 0; i < 15; ++i) i = 0~14 { g_myvar<int,15>[i] = i; 注意[]中的下标数字<=14,否则下标会越界。 } for (int i = 0; i < 15; ++i) { cout << g_myvar<int, 15>[i] << endl; }
- g_myvar<int,15>写法一出现就表示定义了g_myvar<int,15>[15]这个大小为15个元素的int类型数组。
- 变量模板的另一种形式
template <typename T> struct B { const static T value = { 160 }; }; template <typename T> int g_myvar4 = B<T>::value;
- 其中,const static T value = { 160 };
- const也可以写成constexpr,{}也可以不加
- int g_myvar4 = B<T>::value;
- 注意g_myvar4是个变量模板,有点像typedef using 给类型起别名,简化
- 调用:
cout << g_myvar4<int> << endl; 160 注:160,g_myvar4<int>相当于B<int>::value g_myvar4<int> = 152; cout << g_myvar4<int> << endl; 152 cout << B<int>::value << endl; 160
- 成员变量模板
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; -- 定义
- 调用:
cout << D<float>::m_tpi<int> << endl D<float>::m_tpi<int> = 150; cout << D<float>::m_tpi<int> << endl
- 输出:
5 150
别名模板与成员别名模板
- 别名模板英文名"Alias Templates",C++11新标准中引入的
- 引入的目的不但能简化书写,而且可以达到一些通过其他手段难以达到的效果。
- 别名模板
//别名模板 template<typename T> using str_map_t = std::map<std::string, T>;
- 使用:
str_map_t<int> map1; map1.insert({"first",1}); map1.insert({"second",2 });
- 成员别名模板
template<typename T> class E { //成员别名模板 template<typename T> using str_map_t = std::map<std::string, T>; public: str_map_t<int> map1; };
- 使用:
E<float> obja; obja.map1.insert({ "first",1 }); obja.map1.insert({ "second",8 })