C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

函数模板的基本使用: 函数模板就是要实现类型参数化,实现泛型编程,就是可以动态的调整数据类型.

#include <iostream>
#include <typeinfo> using namespace std; // template<> 告诉编译器,下面如果出现T不要报错,T是一个通用的类型
template<class T>
void MySwap(T &x, T &y)
{
T tmp = x;
x = y;
y = tmp;
} template<class T>
T MyAdd(T &x, T &y)
{
return x + y;
} // 此处的typename = class
template<typename T>
void MyPrint()
{
T number;
cout << "type = " << typeid(T).name() << endl;
} int main(int argc, char *argv[])
{
// 自动类型推导: 必须要有参数才能推到(根据参数来确定类型)
int x = 10, y = 20;
MySwap(x, y);
cout << "x= " << x << endl; int ret = MyAdd(x, y);
cout << "x+y = " << ret << endl; // 手动类型指定: 如果参数不一致,可能会报错,此时我们需要告诉它类型
MySwap<int>(x, y);
cout << "x= " << x << endl; // 针对无参数函数处理: 有些函数没有参数,我们需要指定模板默认类型
MyPrint<int>();
MyPrint<double>(); system("pause");
return 0;
}

我们在上面的案例基础上进行一定的加强,通过模板实现一个选择排序,我们可以传入任意的数据类型,都可被解析.

#include <iostream>
#include <typeinfo> using namespace std; template<class T>
void MySwap(T &x, T &y)
{
T tmp = x;
x = y;
y = tmp;
} template<class T>
void SelectSort(T Array[], int len)
{
for (int x = 0; x < len; x++)
{
int max = x;
for (int y = x + 1; y < len; y++)
{
if (Array[max] > Array[y])
max = y;
}
if (max != x)
MySwap(Array[max], Array[x]);
}
} template<class T>
void MyPrint(T Array[], int len)
{
for (int x = 0; x < len; x++)
cout << Array[x] << " ";
} int main(int argc,char *argv[])
{
int Int_Array[10] = { 4, 7, 8, 2, 1, 8, 0, 3, 2, 7 };
SelectSort<int>(Int_Array, 10);
MyPrint<int>(Int_Array, 10); char Char_Array[] = "hello lyshark";
int len = sizeof(Char_Array) / sizeof (char);
SelectSort<char>(Char_Array, len);
MyPrint<char>(Char_Array, len); system("pause");
return 0;
}

实现模板具体化: 通过自定义模板函数,解决模板的局限性问题.

#include <iostream>

using namespace std;

class Student
{
public:
char *m_name;
int m_age;
public:
Student(char *name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; template<class Student>
bool MyCompare(Student &x, Student &y)
{
if (x.m_age == y.m_age)
return true;
return false;
} int main(int argc, char *argv[])
{
Student stu1("lyshark", 22);
Student stu2("admin", 33); bool ret = MyCompare(stu1, stu1);
cout << ret << endl; bool ret1 = MyCompare(stu1, stu2);
cout << ret1 << endl; system("pause");
return 0;
}

定义并使用类模板: 类模板不支持类型的自动推导,所以必须在调用时Student<string, int>显式指定好类型.

#include <iostream>
#include <string> using namespace std; template<class NameType = string,class AgeType = int> // 类模板可以指定默认参数
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name,AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void show() { cout << "name = " << m_name << endl; }
}; template<class Student>
bool MyCompare(Student &x, Student &y)
{
if (x.m_age == y.m_age)
return true;
return false;
} int main(int argc, char *argv[])
{
// 调用类模板是要在类后面添加参数列表
Student<string, int> stu1("lyshark", 25);
stu1.show(); system("pause");
return 0;
}

类模板做函数参数传递: 此处我们将类模板Student<string, int>当做函数参数传递给MyPrint函数.

#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name,AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void show() { cout << "name = " << m_name << endl; }
}; void MyPrintA(Student<string, int> &ptr)
{ ptr.show(); } template<class T1,class T2>
void MyPrintB(Student<T1,T2> &ptr)
{ ptr.show(); } template<class T>
void MyPrintC(T &ptr)
{ ptr.show(); } int main(int argc, char *argv[])
{
// 1. 指定传入的类型直接调用
Student<string, int> stu1("lyshark", 25);
MyPrintA(stu1); // 2. 参数模板化调用
Student<string, int> stu2("admin", 10);
MyPrintB(stu2); // 3.整体模板化调用
Student<string, int> stu3("root", 10);
MyPrintC(stu3); system("pause");
return 0;
}

类模板类内定义类外实现: 类模板同样支持类内定义模板类型,在类外部对其进行具体的实现.


#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name, AgeType age);
void show();
}; // 类外实现成员构造函数
template <class NameType,class AgeType>
Student<NameType, AgeType>::Student(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
} // 类外实现打印函数
template <class NameType,class AgeType>
void Student<NameType, AgeType>::show()
{
cout << "Name = " << this->m_name << endl;
} int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
stu.show(); system("pause");
return 0;
}

类模板友元函数类内实现: 友元函数就是可以让类外直接访问的函数,调用类内友元函数就像调用全局函数一样.

#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
// 友元函数的类内实现
friend void show(Student<NameType, AgeType> &ptr)
{
cout << "name = " << ptr.m_name << endl;
} private:
string m_name;
int m_age;
public:
Student(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
}; int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
// 此处调用,类似于全局调用
show(stu); system("pause");
return 0;
}

类模板友元函数类外实现: 类外实现同理,就是现在类内声明类型作为占位符,然后在类外进行实现.

#include <iostream>
#include <string> using namespace std; // 类外实现必须提前声明模板的存在
template<class T1, class T2> class Student;
template<class T1, class T2> void show(Student<T1, T2> & p); template<class T1,class T2>
class Student
{
// 友元函数类内实现,利用空参数列表声明 (占位符)
friend void show<>(Student<T1, T2> &ptr); private:
string m_name;
int m_age; public:
Student(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
}
}; // 对友元函数的类外实现
template<class T1,class T2>
void show(Student<T1,T2> &ptr)
{
cout << "name = " << ptr.m_name << endl;
} int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
// 此处调用,类似于全局调用
show(stu); system("pause");
return 0;
}

8.6 C++ 泛型化编程态的更多相关文章

  1. Java中的泛型 --- Java 编程思想

    前言 ​ 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...

  2. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  3. Deep Learning 2_深度学习UFLDL教程:矢量化编程(斯坦福大学深度学习教程)

    1前言 本节主要是让人用矢量化编程代替效率比较低的for循环. 在前一节的Sparse Autoencoder练习中已经实现了矢量化编程,所以与前一节的区别只在于本节训练集是用MINIST数据集,而上 ...

  4. 6.6.2 自己主动泛型化(automatic generalization)

    6.6.2 自己主动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数.也看到了在 F# 和 C# 中并排的实现.F# 实现的非常重要方面,是我 ...

  5. React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题

    React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...

  6. c++以代理的方式来实现接口化编程

      假如你项目代码本身已经实现了很多的实体类,但并未采用接口,可以考虑以这种方式来实现接口化编程 struct ITest { virtual void Test()=0; }; class CTes ...

  7. linux无锁化编程--__sync_fetch_and_add系列原子操作函数

    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令 ...

  8. 初探CORBA组件化编程

    1.掌握组件化开发的概念,了解CORBA模型及ORB机制:2.掌握CORBA组件编程方法.二.实验内容(一).步骤1.配制环境JDK环境.2.编写编译IDL接口.3.编写编译服务端程序.4.编写编译客 ...

  9. vue组件化编程应用2

    写几个小案例来理解vue的组件化编程思想,下面是一个demo. 效果图示: 需求: header部输入任务,进行添加,在list中显示; list中每个item项,鼠标移入时,背景变灰并显示delet ...

  10. vue组件化编程应用

    写几个小案例来理解vue的组件化编程思想,下面是一个demo. 效果图示: 功能: Add组件用于添加用户评论,提交后右边评论回复会立马显示数据.Item组件点击删除可以删除当前用户评论.当List组 ...

随机推荐

  1. 【Docker】docker介绍 什么是虚拟化 容器与虚拟机比较 Docker 概念 docker安装

    目录 docker介绍 什么是虚拟化 docker是什么 容器与虚拟机比较 Docker 概念 docker安装 docker介绍 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization ...

  2. Codeforces Round #623 (Div. 2) A~D题,D题multiset使用

    比赛链接:Here 1315A. Dead Pixel 签到题, 比较四个值 max(max(x, a - 1 - x) * b, a * max(y, b - 1 - y)) 1315B. Home ...

  3. 详解 Serverless 架构的 6 大应用场景

    导读 Serverless 架构将成为未来云计算领域重要的技术架构,将会被更多的业务所采纳.进一步深究,Serverless 架构在什么场景下有优秀的表现,在什么场景下可能表现得并不是很理想呢?或者说 ...

  4. 云原生 Serverless Database 使用体验

    作者 | 李欣 近十年来互联网技术得到了飞速的发展,越来越多的行业加入到了互联网的矩阵,由此带来了更为丰富且复杂的业务场景需求,这对于数据应用系统的性能无疑是巨大的挑战.​ 关系型数据库 MySQL ...

  5. FZU 2232

    ***题意:求最大匹配是否为n 今天突然想起来吧模板改一下,然而自己得想法不对,WA了有十多次吧,看了一下题解,不需要改,套上模板就行*** #include<stdio.h> #incl ...

  6. 0xGame 2023【WEEK2】Crypto全解

    中间的那个人 题目信息 from secret import flag from Crypto.Util.number import * from Crypto.Cipher import AES f ...

  7. 【Tomcat 组成与工作原理】

    Tomcat组成与工作原理 Tomcat 是什么 开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 ...

  8. 【面试题精讲】你知道MySQL中有哪些隔离级别吗

    有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...

  9. 【ES系列】(一)简介与安装

    首发博客地址 首发博客地址 系列文章地址 教学视频 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了 ...

  10. [转帖]HAProxy 在 TiDB 中的最佳实践

    https://docs.pingcap.com/zh/tidb/stable/haproxy-best-practices 本文介绍 HAProxy 在 TiDB 中的最佳配置和使用方法.HAPro ...