C++模板编程与泛型编程之类模板、变量模板、别名模板(六)

变量模板与成员变量模板

  • 变量模板: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 })

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值