类模板、变量模板、别名模板 基础知识点三

模板模板参数

  1. 模板模板参数(Template Template Parameters):就是让模板参数本身成为模板。
  2. a)类型模板参数 b) 非类型模板参数 c) 模板模板参数。
#include <iostream>
#include <list>
#include <vector>
#include <string>

using namespace std;

namespace _nmsp1
{
	//T:类型模板参数,代表容器中元素类型。
	//Container:不叫做类型模板参数,而叫做模板 模板参数,表示这个模板参数本身又是一个模板
	//template<typename T,typename Container=std::vector>  //第二个参数不能这样写
	template<typename T, 
			template <typename W> typename Container=std::vector       //1.这就是一个模板模板参数,写法比较固定,这里的名字叫Container,也可以叫做U等。
				//template <class> class Container=std::vector         //2.这里的W可以省略,这里的W是作为 Container 类型模板模板参数类型的。                                    
			>                                                          //3.与上面的写法等 价,typename 可以换成 class 
	class MyClass                                                      //4.如果没有使用到 Container,也可以直接省略,就变成了这样:template <typename W> typename =std::vector
	{
	public:
		Container<T> myc;

		MyClass()
		{
			for (int i = 0; i < 10; i++)
			{
				myc.push_back(i);
				cout << "call MyClass()" << endl;
			}
		}

		void func();
	};

	template<
			template<typename W,W* pointer> typename Container   //这种时候,W不能省略,W才有用。
		    >
		class MyClass2
		{
		public:
			//W* m_p; //不可以在这里使用W。(W叫做:模板模板参数,Container的模板参数,不能够在MyClass2中使用它)
		};

	template<typename T,
		template <typename W> typename  = std::vector                                     
	>                 //如果没有使用到 Container,也可以直接省略,就变成了这样:template <typename W> typename =std::vector        
	class MyClass3
	{
	public:
		
	};

	template<typename T,
		template <typename W> typename Container
	>
	void MyClass<T, Container>::func()
	{
		cout << "void MyClass<T, Container>::func()" << endl;
	}
}

int main(int argc, char* argv[])
{

	_nmsp1::MyClass<double, list> mylist; // double是容器中元素类型;list是容器类型

	return 0;
}

共用体模板(联合模板)

  1. 可以把联合理解成一种类类型(不要理解成类)。联合体也支持模板化。
#include <iostream>
#include <list>
#include <vector>
#include <string>

using namespace std;

namespace _nmsp2
{
	template <typename T,typename U>
	union MyUnion
	{
		T carnum;  //
		U cartype; //
		U carname[60]; //
	};
}

int main(int argc, char* argv[])
{
	_nmsp2::MyUnion<int, char> myu;
	myu.carnum = 156;

	cout << myu.carnum << endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

repinkply

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值