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

模板模板参数

  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;
}
posted @   repinkply  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示