WHCSRL 技术网

c++变量模板总结

一:定义,泛化,全特化,偏特化,使用方法

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;

//变量模板的泛化版本
template <typename T> //(1)
T g_tmp{};//变量的零初始化方式

//变量模板的全特化,,这里的char可以和int不一样
template<>//(2)
char g_tmp<float>{'a'};

//变量模板的偏特化,从参数范围上的偏特化,必须要求是T*,依赖于T
template<typename T>//(3)
T g_tmp <T*>{10};


//变量模板的偏特化,从参数范围上的偏特化,必须要求是T*,依赖于T
template<typename T>//(4)
T g_tmp <const T*>{100};

int main()
{
	/*
	变量模板:Variable Templates,c++14引入,一般写在.h文件当中
	从感觉上,变量模板与函数模板有些类似,看起来象一个没有参数,但是有返回值的函数模板*/

	//变量模板的,泛化,偏特化,以及全特化和使用
	g_tmp<int> = 20;
	std::cout << g_tmp<int> << std::endl;

	g_tmp<float>;
	std::cout << g_tmp<float> << std::endl;

	g_tmp <int*>;
	std::cout << g_tmp<int*> << std::endl;

	g_tmp <const int*>;
	std::cout << g_tmp<const int*> << std::endl;

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

在这里插入图片描述
二:变量模板默认模板参数

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;
![在这里插入图片描述](https://img-blog.csdnimg.cn/c762929e4bb64018adb8d4c7c7907512.png)

//变量模板,默认模板参数
template <typename T = int> 
T g_tmp{};//变量的零初始化方式

int main()
{
	g_tmp<int> = 5;
	g_tmp<> = 15;
	printf("%%p,%%d
", &g_tmp<int>, g_tmp<int>);
	printf("%%p,%%d
", &g_tmp<>, g_tmp<>);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述
三:非类型模板参数

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;
//变量模板,非类型模板参数
template <typename T, int value> 
T g_tmp[value]{};//变量的零初始化方式
int main()
{
	for (int i = 0; i < 15; i++)
	{
		g_tmp<int, 15>[i] = i;  //g_tmp<int, 15>出现就代表定义了g_tmp[value]这么一个数组
	}
	for (int i = 0; i < 15; i++)
	{
		std::cout << g_tmp<int, 15>[i] << '	';
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

四:变量模板的另一种形式

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;

//变量模板,另一种表现形式
template <typename T>
struct B
{
	const static T value = { 160 }; //const也可以写成constexpr,{}也可以不加,注意是静态成员变量
};

template <typename T>
int g_tmp = B<T>::value; //注意g_tmp是个变量模板
int main()
{
	cout << g_tmp<int> << endl; //160,g_tmp<int>相当于B<int>::value

	printf("%%p
", &g_tmp<int>);
	printf("%%p
", &B<int>::value);

	g_tmp<int> = 152;
	cout << g_tmp<int> << endl; //152
	//cout << B<int>::value << endl; //160
	
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

五:成员变量模板

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;

template <typename T>
class TMP
{
public:
	template <typename U>
	//U m_i = {}; 只可以使用静态成员变量
	static U m_i;
};

template <typename T>
template <typename U>
U TMP<T>::m_i = 10;

int main()
{
	TMP<int>::m_i<int> = 100;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
推荐阅读