浅谈C++中的泛型编程

浅谈C++元编程 随着 C++ 11/14/17 标准的不断更新,C++ 语言得到了极大的完善和补充。元编程作为一种新兴的编程方式,受到了越来越多的广泛关注。结合已有文献和个人实践,对有关 C++ 元编程进行了系统的分析。首先介绍了 C++ 元编程中的相关概念和背景,然后利用科学的方法分析了元编程的 演算规则、基本应用 和实践过程中的 主要难点,最后提出了对 C++ 元编程发展的 展望。 1 引言 1.1 什么是元... 阅读详情

一、概述

泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含
意。所谓泛型编程,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。上面所叙述的是函数模板,实际上模板分为函数模板和类模板。类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,所以将类中的类型进行泛化。

二、模板的形式

1、函数模板语法格式
template<typenam T>
template<class T>
-------------------------------------
template<typename 类型参数表>
 返回类型 函数模板名(函数参数列表)
{
    函数模板定义体
}
2、类模板的语法格式
template<typename T>
class A{}

template是语义是模板的意思,尖括号中先写关键字 typename 或是
class ,后 面跟一个类型 T,此类即是虚拟的类型。至于为什么用 T,用的人多了,也就是 T 了。

三、函数模板细化和模板案例

1、模板函数小案例
#include <iostream>
using namespace std;

template<typename T>
void swap(T &a, T &b)
{
    T t = a;
    a = b;
    b = t;
}

int main()
{
    int x = 10;
    int y = 20;
    cout << "int型交换前" << endl;
    cout << "x=" << x << "y=" << y << endl; 
    swap<int>(x, y);
    cout << "int型交换后" << endl;
    cout << "x=" << x << "y=" << y << endl; 

    float e = 1.1;
    float f = 2.2;
    cout << "float类型交换前" << endl;
    cout << "e=" << e << "f=" << f << endl; 
    swap <float>(e, f);
    cout << "float类型交换后" << endl;
    cout << "e=" << e << "f=" << f << endl;

    return 0;
}

总结:函数模板,只适用于函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板

2、函数模板与函数重载
#include <iostream>
using namespace std;
template <typename T>
void swap(T &a, T &b)
{
    cout << "我是模板函数" << endl;
    T t = a;
    a = b;
    b = t;  
}

void swap(char &a, int &b)
{
    cout << "我是普通函数" << endl;
    int t = a;
    a = b;
    b = t;
}

int main()
{
    char cData = "a";
    int iDate = 10;
    swap(cData, iDate);
    swap(iDate, cData);
    swap<int>(iDate, cData);
    return 0;
}

总结:普通函数会进行隐士的数据类型转换, 函数模板不提供隐式的数据类型转换必须是严格的匹配。当函数模板和普通函数都符合调⽤用时,优先选择普通函数,若显⽰示使⽤用函数模板,则使⽤用<>类型列表。如果
函数模板产⽣生更好的匹配使⽤用函数模板。

3、模板编译机制总结
  • 编译器并不是把函数模板处理成能够处理任意类的函数
  • 编译器从函数模板通过具体类型产生不同的函数
  • 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。

四、类模板细化和模板案例

1、一个简单的类模板小案例
#include <iostream>
using namespace std;

template<typename T>
//template<class T>
class A
{
    public:
        A(T tt)
        {
            this->t = tt;   
        }

        T &getT()
        {
            return t;   
        }

    private:
        T t;
};

int main(void)
{
    A<int> a(100);
    cout << a.getT() << endl;
    return 0;
}

总结:在类模板前应该用template<typename T>或者template<class T>来声明。

2、模板类的派生
#include <iostream>
using namespace std;

template<typename T>
class A
{
    public:
        A(T tt)
        {
            this->t = tt;   
        }
    private:
        T t;
};

//模板类派生普通类
class B : public A<int>
{
    public:
        B(int t, int ii) : A<int> a
        {
            this->ii = i;   
        }

        void printB()
        {
            cout<< "i:" << i <<endl;
        }
    private:
        int i;
}

//模板类派生模板类
template <class T>
class C : public A<T>
{
    public:
        C(T jj, T t) : A<T> t
        {
            this->jj = j;   
        }

        void printC()
        {
            cout << "j:" << j <<endl;
        }
    private:
        T j;
};

总结:子类从模板类继承的时候,需要让编译器知道⽗父类的数据类型具体是什么(数据类型的本质:固定⼤大⼩小内存块的别名)A<int>

C++泛型编程:源起、实现与意义 免积分 C++泛型编程:源起、实现与意义,免积分下载。 立即下载

相关推荐

手把手教你用闲置安卓手机搭建个人收款系统(蓝鲸支付私有化部署实战)

本文详细介绍了如何利用闲置安卓手机搭建个人收款系统,实现私有化支付部署。通过开源技术栈和容器化方案,零成本构建安全、高效的支付网关,解决传统支付平台的数据安全和资金风险问题。特别适合个人开发者和小微企业主,无需复杂审批,资金实时到账,显著降低运营成本。

weixin_30363285的博客 381

C++泛型编程:源起、实现与意义

C++泛型编程:源起、实现与意义 为什么泛型 泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一 个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个 List 类存放所有可能类型的 对象,这样的事情;熟悉一些其它面向对象的语言的人应该知道,如 Java 里面这是通过在 List 里面存放 Object 引用来实

li_hai的专栏 2348

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

C++泛型详解

如果要在函数模板内部使用这样的类型,必须显示告诉编译器这个名字是一个类型,否则编译器无法得知它是一个类型还是一个值。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(nontype parameter)。编译器将确定用什么类型代替每个类型形参,用什么值代替每个非类型形参,然后产生并编译(称为实例化)该版本的函数。在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。

程序猿老樊的博客 5252

tree_sitter多语言解析器配置实战指南

本文是一份详细的Tree-sitter多语言解析器配置实战指南。文章从零开始,手把手指导如何搭建Python环境、安装指定版本的tree-sitter库、下载并编译多种语言的语法规则,最终构建一个统一的解析器库。通过实战代码演示了如何初始化解析器、解析代码并遍历语法树,旨在帮助开发者高效处理多语言代码分析任务,并分享了高级技巧与常见问题排坑经验。

weixin_29245767的博客 267

Unity详细介绍说明限制Unity帧率的方式

在Unity开发中,帧率(FPS,Frames per Second)是一个非常重要的表现标准,它直接影响了游戏运行的流畅度。在某些应用场景里,我们可能需要手动限制帧率。限制帧率可以减少电脑的CPU和GPU负载,使运行更加稳定,同时对于移动设备来说还能有效降低电量消耗。下面就详细介绍几种限制Unity中帧率的方式。

zjw1349547081的专栏 5437

对C++泛型编程的理解

1、泛型是什么? 泛型编程是什么? 实质上就是不使用具体数据类型(int、double、float等),而是使用一种通用类型来进行程序设计的方法,泛泛的描述一下数据,这个方法可以大规模的减少程序代码的编写量。 模板函数如下: 其中,T是一个占位符(数据类型占位符),也就是说,将来T这个位置是一个真实的、具体的数据类型。 所以,可以把T这种类型占位符也称为一种数据类型,就叫泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。 总之,泛型也是一种数据类型,但它是用来代替所有类型的“通用类

Devin的博客 463

告别迷茫!手把手教你用Synopsys VC USB VIP搭建验证平台(附UVM分层序列实战解析)

本文详细介绍了如何使用Synopsys VC USB VIP搭建验证平台,并深入解析UVM分层序列的实战应用。通过Step-by-Step的操作指南和关键配置示例,帮助验证工程师高效集成USB VIP,掌握从环境搭建到测试用例开发的全套技能,特别适合处理复杂协议验证的挑战。

weixin_42520573的博客 554

C++的泛型编程

C++ 的泛型编程主要通过模板(template)实现。模板允许编写能够处理多种数据类型的代码,而无需为每种数据类型编写单独的函数或类。这通过参数化类型来实现,编译器会在编译时根据实际使用的类型生成具体的代码。

zxtzxt12138的博客 1430

封神台靶场,为了小芳,冲之——cookie注入

第二个靶场 打开网站 找一下注入点 一般在新闻这种里面点开看看 先判断是否存在注入 有waf 尝试了很多方法绕过都没成功,/and/,aandnd,AnD等一系列都没绕过去,乌鸡鲅鱼 删掉id=169 发现 然后判断cookie注入 在搜索框输入 Javascript:alert(document.cookie=”id=”+escape(‘169’)); 然后弹窗了(其中 “id=” 取决URL中的id= escape中的数值也是URL中id=的值)返回刚刚的页面,把ID删除后一样能正常显示。说明服务器能

Wubuqing的博客 654

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 874

C++泛型编程

写在前面: 0. 所谓泛型编程就是独立于任何特定类型的方式编写代码,使用泛型程序时,需要提供具体陈旭实例所操作的类型或者值。我们经常用到STL容器、迭代器、和算法都是泛型编程的例子; 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型; 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类

_Jomie 3113

【思考模型框架】MECE原则,确保分析时,考虑到的所有因素,既不重叠又无遗漏

MECE原则,是Mutually Exclusive and Collectively Exhaustive的缩写,中文译为“相互独立、完全穷尽”。MECE原则,这是一种逻辑思维和组织信息的方法,旨在确保分析时既没有遗漏也没有重复。MECE原则,相互独立、完全穷尽(Mutually Exclusive,Collectively Exhaustive)的原则MECE原则,确保分析时考虑到的所有因素既不重叠又无遗漏。

奶爸的编程之路,也就一周冷个三天 2755

浅谈C++模板与泛型编程

一、如何进行泛型编程: C/C++是一种静态编程语言,必须需要把代码翻译成可执行的二进制可执行程序然后在运行,一旦编译好之后就不能再变了(数据类型确定后就无法更改,因此要为每一种数据类型编写一份算法) + C语言中的快速排序: void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const...

Canger_的博客 1114

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

模板与泛型编程浅谈

模板与泛型编程浅谈 摘要(Effective C++): ​ C++template的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map。然而当愈多人用上templates时,他们发现template有能力完成愈多可能的变化。容器当然很好,但泛型编程(generic programming)——写出的代码和其所处理的对象类型彼此独立——更好。STL算法如for_each,find和merge就是这一类编程的结果。最终人们发现,C++template机制自身是一部完整的图灵机

weixin_51958878的博客 1589

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

浅谈C++的泛型编程以及模板

C++的泛型编程及模板

m0_62126248的博客 649

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

enum 泛型_浅谈C++与C#泛型编程的区别与联系

前言这阵子群友讨论了很多次C++模板元编程和C#泛型的区别,但是大家懂得,在QQ群讨论这种体量的论题,你一言我一语很难说清楚,尤其是大家对各种名词的理解和定义不一致的情况下,所以我决定今天整一篇文章,结合代码,浅谈一下C++和C#泛型编程的区别与联系。个人水平有限,欢迎大家指正,补充。名词定义正如上面所说,每个人对于各种名词的认识之间可能存在着差别,所以在这里统一用我的方式定义一下以下名词泛型:泛...

weixin_39701735的博客 335

浅谈泛型编程

泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。比如qsort泛化之后就变成了:   template void sort(RandomAccessIterator first, RandomAccess

程序道 -Learning, Thinking and Coding <存储知识的金库> 514

浅谈泛型编程与C++泛型

泛型是什么,C++泛型编程又是什么? 在计算机程序设计领域,为了避免因数据类型的不同,而被迫重复编写大量相同业务逻辑的代码,人们发展的泛型及泛型编程技术。 那么,什么是泛型呢?本节就带领读者深度剖析一下这个问题。 所以泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。 为了更好地说明使用具体数据类型有多么麻烦,这里先举个例子,假设客户需要一个函数,功能是返

技术宅拯救世界 420

C++的内存管理及初识泛型编程(模板)

对于c++和c的内存管理的方式,二者在内置类型上并无区别,但是对于c来说,自定义类型的内存管理,初始化的方式就非常困难,而c++的delete和new就能解决这个方式.class Apublic:: _a(a)~A()private:int _a;定义一个类A对于上四者来说,第一个只会申请空间,对于第二个,它会在给a分配空间的同时去调用默认构造,对于第三个来说,它会用三去调用它的构造函数,对于第四个,它它会给这个块连续的空间调用5次构造函数,并且最后一种也支持用花括号进行初始化.

20 • backend dev • building things that just work • learning systems & low level stuff • love video games 692

C++泛型编程之函数模板浅谈

目录 为什么要用函数模板 1、宏定义的优缺点 2、函数的优缺点 3、函数模板 1、函数模板有两个关键字template和typename 2、函数模板定义多个不同数据类型 3、函数模板的调用 4、函数模板实现排序等算法 5、函数模板优点与总结 6、完整的示例代码 为什么要用函数模板 为什么要使用函数模板?顾名思义就是一个通用模板,可以直接套入使用。在以往C语言的编程中,我们可能会利用宏定义去实现这模板技术,在C++基础编程中可能就是用函数去实现了,可能在很多时候类型不同,...

Monkey_lwx的博客 813

浅谈 C++ 元编程

随着 C++ 11/14/17 标准的不断更新,C++ 语言得到了极大的完善和补充。元编程作为一种新兴的编程方式,受到了越来越多的广泛关注。结合已有文献和个人实践,对有关...

腾讯技术工程 5670

浅谈.NET中泛型的基本原理

1 .NET为什么要引入泛型?   说到.NET泛型,应该都不陌生,毕竟泛型是.NET 2.0中就推出的特性,各位博友应该都知道引入泛型的最主要目的是为了解决装箱、拆箱带来的性能损失,说的当然没有错,但是不够“太具体”,确切来讲泛型解决了原先无法避免的容器操作的装箱拆箱问题。   目的就说这么多吧,言简意赅,该说的说了,多说无益。   2.浅谈.NET泛型原理   有过C+

wangyizhi58的专栏 949

浅谈C++中模板以及范式编程

C++模板的用法

记录一些平时工作或者学习中的瞬间 986
上一篇: C++中的解引用与智能指针
下一篇: C++中的类型转换
The_Web3_社区
博客等级 码龄10年 388粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

The_Web3_社区

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

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

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

打赏作者

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

抵扣说明:

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

余额充值