首页 > 编程语言 >C++-template class-模板类

C++-template class-模板类

时间:2023-04-16 23:48:36浏览次数:40  
标签:C++ DemoArray template Pair class 模板 特化

C++-template class-模板类

【C++高级教程,C++类模板一次讲透,必须收藏!】 https://www.bilibili.com/video/BV1v84y1x7Qp/?share_source=copy_web&vd_source=3809390a14c335e7731c9e076c03eeba

类模板概念

类模板是用于生成类的模板。
在编译阶段,编译器会根据类模板的使用情况创建出仅部分成员数据类型,和部分成员函数的参数类型不同,其他完全相同的若干类。
通过类模板的这些特性我们可以尝试写出用于存放不同类型数据的容器。

类模板使用

  • 类模板的声明如下,其中T表示任何类型,由用户指定:
template<typename T,...>
class 类名
{
	//成员
};
  • 类模板的成员函数定义如下,一般类模板的定义也应该写在头文件中:
template<typename T,...>
返回类型 类名<T,...>::成员函数名(形参列表)
{
	//函数体
}

Demo

#ifndef __DEMOARRAY_H
#define __DEMOARRAY_H

#include <iostream>

template <typename T>
class DemoArray
{
private:
	T data[20];
	int len;
public:
	DemoArray();
	T indexof(int index);
	void addValue(T value);
}

template <typename T>
DemoArray<T>::DemoArray()
	:len(0)
{

}

template <typename T>
DemoArray<T>::indexof(int index)
{
	return data[index];
}

template <typename T>
DemoArray<T>::addValue(T value)
{
	if(len<20)
		data[len++] = vale;
}


/////////////////////////////
//特化类 指定类型float
template<>
class DemoArray<float>
{
public:
	DemoArray();
};

DemoArray<float>::DemoArray()
{
	std::cout<<"DemoArray<float>::DemoArray()"<<std::endl;
}



#endif

类模板特化和偏特化

类模板的特化

类模板特化是指在实例化类模板时,对特定类型的泛型进行特殊的处理,即用户指定所有特定类型的类模板时,通过特化过类模板生成的类可能与其他类有完全不同的结构。

特化类模板是需要对整个类模板进行声明定义:

template<>
class 类名<指定类型,指定类型,...>{//类成员};

类模板的偏特化

偏特化与特化类似,只是特化会指定所有的泛型,而偏特化只指定部分泛型。
偏特化类模板是需要对整个类模板进行声明定义:

template<typename T,...不需要特化的泛型...>
class 类名<指定类型,...,不需要特化的泛型名,...>{//类成员};

偏特化Demo

#ifndef _PAIR_H
#define _PAIR_H
#include <iostream>

template <typename T1, typename T2>
class Pair
{
private:
	T1 first;
	T2 second;
public:
	Pair();
};

template <typename T1, typename T2>
Pair<T1,T2>::Pair()
{
	std::cout<<"Pair<T1,T2>::Pair"<<std::endl;
}

////////////////////////
//偏特化
template<typename T2>
class Pair<char, T2>
{
public:
	Pair();
};
template<typename T2>//偏特化,这里不能省略
Pair<char,T2>::Pair()
{
	std::cout<<"Pair<char,T2>::Pair"<<std::endl;
}

#endif

标签:C++,DemoArray,template,Pair,class,模板,特化
From: https://www.cnblogs.com/yongchao/p/17324434.html

相关文章

  • C++ Part1
    C++是在C语言的基础上发展而来的,解决了C语言中存在的一些明显的问题。本文针对C语言存在的问题,引出C++中的解决方案,以对C++的语法进行说明和分析。命名空间域的概念可以将C++中的域理解为作用域。C++标准规定:使得特定名字保持有效的那些可能并不连续的程序文本就是该名字的作用域。......
  • 深入理解 JVM --- Class 类文件结构
    各种不同平台的Java虚拟机,以及所有平台都统一支持的程序存储格式——字节码(ByteCode)是构成平台无关性的基石。时至今日,商业企业和开源机构已经在Java语言之外发展出一大批运行在Java虚拟机之上的语言,如Kotlin、Clojure、Groovy、JRuby、JPython、Scala等。实现语言无关性的基......
  • C++20 Advent of Code 可见树 Day 8: Treetop Tree House
    C++20AdventofCode可见树Day8:TreetopTreeHouseDay8-AdventofCode2022#include<iostream>#include<vector>#include<fstream>#include<string>#include<ranges>#include<numeric>#include<algorithm>#in......
  • C++ 20 协程总结
    C++20协程总结介绍C++20提供的是非对称的、一等对象、无栈的协程(CoroutinesinC++20areasymmetric,first-class,andstackless)所谓协程,即用户级线程,一种用于将异步代码同步化的编程机制,使得程序的执行流可以在多个并行事务之间切换但又不必承担切换带来的过高的性能损耗。......
  • 传送,条件加速 Learn Unreal Engine (with C++)
    传送pawn进入box触发OnActorBeginOverlap获取目标位置,下一帧将pawn坐标更改为目标位置首先需要重叠函数与开始重叠事件绑定OnActorBeginOverlap.AddDynamic(this,&ATeleporterActor::OnOverlapBegin);头文件声明UPROPERTY(EditAnywhere) ATeleporterActor*Target=nullptr......
  • c++训练打卡(8)
    冒泡排序流程图:伪代码:源代码:#include<stdio.h>intmain(){ intN,i,j,Max; inta[100]; printf("请输入要比较的数据的个数:"); scanf("%d",&N); printf("请输入所要比较的数据:"); for(i=0;i<N;i++){ scanf("%d",&a[i]); } for(i=0;i<N;i......
  • template标签的学习
    template标签我在引用这个标签的时候,本来还在纳闷,咋就他那么特殊,就他不显示,然后突然意识到,这个标签天生不可见,即display:none属性可以在template标签里面放content模块,然后使用button点击事件实现内容的展现;具体实现如下:<template><ul><li>模块1</li><......
  • C++ —— 重载、重写和重定义
    1重载一般是类内部方法的关系classMyClass{public:voidMyPrint();voidMyPrint(intcnt);voidMyPrint(intcnt,conststring&msg);};2重写一般父子类中方法的关系对父类虚函数进行重载classMyClass{public:virtualvoidMyPrint();};c......
  • c++文件操作
    include<iostream>#include<fstream>usingnamespacestd;#include<string>voidtest01(){stringl;ofstreama;a.open("test.txt",ios::out);/*getline(cin,l);*///可以正常写入空格a<<"你好!!!"<......
  • C++实现多线程
    #include<iostream>#include<chrono>#include<thread>voidprintNumbers1(){for(inti=1;i<=10000;i++){std::cout<<"Thread1:"<<i<<std::endl;}}voidprintNumbers2(){for......