当前位置: 首页 > article >正文

C++泛型编程:类模板(上)

类模板与函数模板的区别:

类模板没有自动类型推导的使用方式
类模板在模板参数列表中可以有默认参数

template <class NameType,class AgeType = int>
class Person
{
public:
	Person(NameType name, AgeType age);
	void showPerson()
	{
		cout << this->m_Name << " " << this->m_Age << endl;
	}
	NameType m_Name;
	AgeType m_Age;
};
template <class NameType, class AgeType>
Person<NameType,AgeType>::Person(NameType name, AgeType age)
{//类模板中成员函数类外实现需要加上模板参数列表
	this->m_Name = name;
	this->m_Age = age;
}
void test01()
{
	Person<string, int>p1("孙悟空",999);
	p1.showPerson();
	Person<string>p2("ZN", 19);
	p2.showPerson();
}

类模板中成员函数创建时机:

类模板中成员函数在调用时才创建

class Class1
{
public:
	void show1()
	{
		cout << "Person1" << endl;
	}
};
class Class2
{
public:
	void show2()
	{
		cout << "Person2" << endl;
	}
};
template <class T>
class Myclass
{
public:
	T obj;
	void func1() { obj.show1(); }
	void func2() { obj.show2(); }
};
void test02()
{
	Myclass<Class1> p1;
	p1.func1();
}

类模板对象做函数参数:

①指定传入类型(最常用)

void printPerson1(Person<string, int>& p)
{
	p.showPerson();
}

②参数模板化

template <typename T1,typename T2>
void printPerson2(Person<T1,T2>& p)
{
	p.showPerson();
	cout << "T1的类型为:" << typeid(T1).name() << endl;
	cout << "T2的类型为:" << typeid(T2).name() << endl;
}

③整个类模板化

template <typename T>
void printPerson3(T &p)
{
	p.showPerson();
	cout << "T的数据类型:" << typeid(T).name() << endl;
}
void test03()
{
	Person<string, int> p1("Ning", 19);
	printPerson1(p1);
	printPerson2(p1);
	printPerson3(p1);
}

运行结果:

Ning 19
Ning 19
T1的类型为:class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
T2的类型为:int
Ning 19
T的数据类型:class Person<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>


http://www.kler.cn/a/228728.html

相关文章:

  • springboot音乐播放器系统
  • [Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令
  • GraphRAG: Auto Prompt Tuning 实践
  • 架构思考与实践:从通用到场景的转变
  • Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统
  • JSON数据格式的序列化和反序列化jackson针对首字母小学的字段返回序列化后第2个大写字母也变成小写的问题处理
  • 点灯科技esp32 idfv5.1组件库
  • 【ArcGIS Pro】从0开始
  • IP协议(2) 和 数据链路层协议基础
  • 华为自动驾驶干不过特斯拉?
  • Zephyr NRF7002 实现AppleJuice
  • openGauss学习笔记-212 openGauss 数据库运维-日志参考
  • 服务器和云服务器哪个更安全?
  • Unity3D判断屏幕中某个坐标点的位置是否在指定UI区域内
  • 小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】
  • 《云原生安全攻防》-- 云原生安全概述
  • Vue学习笔记之组件基础
  • 01-Datahub是什么?
  • SpringBoot中数据库的连接及Mybatis的配置和使用
  • leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2
  • aspose-words基础功能演示
  • Qt PCL学习(一):环境搭建
  • flink写入es的参数解析
  • PyTorch识别验证码
  • 【云原生kubernetes系列】---亲和与反亲和
  • docker更换镜像源