C++与Typescript的区别

news2024/11/19 5:31:19

目录

一、C++类模板和函数模板

1.类模板

2.函数模板

二,Typescript 的泛型声明

1.泛型函数

2.泛型类

为什么C++和Typescript语言中主张模板和泛型


一、C++类模板和函数模板

在C++中,类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有鼻子,耳朵,眼镜。但是有些人整合在一起就是帅哥美女,有的就长成。。。

C++主要分为两个模板-------类模板和函数模板。

1.类模板

template<class T1, class T2, class Tn>
class 类模板名
{
 // 类内成员定义
};

通常类模板是这样的格式。(typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class)

template <typename T>  
class AnimalHouse {  
private:  
    T size; // 房间的大小  
public:  
    AnimalHouse(T size) : size(size) {} // 构造函数,用来设置房间的大小  
    void displaySize() {  
        std::cout << "房间的大小是:" << size << std::endl;  
    }  
};
//这样使用
int main
{
AnimalHouse<int> elephantHouse(100); // 创建一个大房间给大象住,大小为100  
elephantHouse.displaySize(); // 显示这个大房间的大小  
  
AnimalHouse<int> rabbitHouse(50); // 创建一个小房间给兔子住,大小为50  
rabbitHouse.displaySize(); // 显示这个兔子的小房间的大小
}

 在这个例子中,AnimalHouse 是一个类模板,它接受一个类型参数 T。这个T可以是任何数据类型,比如int、float或者自定义的数据类型。通过使用类型参数 T,你可以创建不同大小的房间。

2.函数模板

template<typename T1, typename T2,......,typename Tn>
返回值 函数名(参数列表)
{

}

typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class。

template <typename T>  
T magicBox(T a, T b, bool operation)
 {  
    if (operation) 
    {  
        return a + b; // 如果选择加法,就返回两个数的和  
    }
 else
    {  
        return a - b; // 如果选择减法,就返回第一个数减去第二个数的结果  
    }  
}


int main()
{
int a=5;
int b=3;
std::cout<<magicBox<int>(a,b,true)<<std::endl; // 计算5 + 3 = 8并输出结果
std::cout<<magicBox<int>(a,b,false)<<std::endl;// 计算5 - 3 = 2并输出结果
}

 在这个例子中,magicBox 是一个函数模板,它接受两个类型参数 T 和一个布尔值 operation。类型参数 T 可以是任何数据类型,比如int、float或者自定义的数据类型。布尔值 operation 用来决定是做加法还是减法。

类模板函数模板
定义方式使用template关键字后跟类型参数与类模板相同
适用场景适用于需要创建不同数据类型的对象,并使用相同逻辑处理的场景适用于需要编写处理不同数据类型的通用函数的场景
代码复用通过创建模板类的实例来复用代码通过函数模板来复用代码
实例化次数类模板的实例化次数与其对象实例的创建次数一致函数模板的实例化次数与其函数的调用次数一致
类型参数的使用范围类型参数用于类声明和类实现中的成员函数和成员变量类型参数用于函数声明和函数定义中,也可以用于返回值和参数类型
自动数据类型推导不可以不可以

二,Typescript 的泛型声明

TypeScript 是 JavaScript 的一个超集(父集),增加了类型检查和其他的特性。在 TypeScript 中,你可以使用泛型来编写可重用的组件或函数,这些组件或函数可以处理多种数据类型。它的泛型有两种分别是泛型函数和泛型类

1.泛型函数

function identity<T>(arg: T): T {  
    return arg;  
}  
  
let output = identity(10);  

在上面的例子中,identity 函数是泛型函数。它使用 <T> 来定义一个类型参数,并在函数的参数和返回类型中使用这个类型参数。

2.泛型类

class GenericNumber<T> {  
    zeroValue: T;  
    add: (x: T, y: T) => T;  
}  
  
let myGenericNumber = new GenericNumber<number>();  
myGenericNumber.zeroValue = 0;  
myGenericNumber.add = (x, y) => x + y;

在这个例子中,我们创建了一个名为 GenericNumber 的泛型类,它有一个类型参数 T。然后我们创建了 GenericNumber 的一个实例 myGenericNumber,并指定 T 为 number 类型。这样,我们就可以在 myGenericNumber 对象上使用数字操作了。

<T>表示定义模板类型,(value: T): T 表示参数和返回值类型都是同一个类型,具体T是什么类型就实参决定。

C++模板TypeScript泛型
定义方式使用关键字 "template" 来定义函数或类模板使用泛型符号 "<>" 在函数或类声明中定义泛型
类型参数template<typename T1, typename T2>;
(注意这里typename要大写)
<T1, T2>
(C++和TypeScript都可以使用多个类型)
类型检查编译时进行类型检查,可以优化代码运行时进行类型检查,可能影响性能
函数模板/泛型函数

template<typename T> T add(T a, T b)

{
return a + b;
}

function add<T>(a: T, b: T): T

{
return a + b;
}

类模板/泛型类template<typename T> class Box { public: T content; Box(T value); };

class Box<T> 

{
public: T content; Box(T value);
};

为什么C++和Typescript语言中主张模板和泛型

  • 提高代码复用性:通过模板和泛型,程序员可以编写更加通用的代码,这些代码可以在多种数据类型上运行,而不需要为每一种数据类型单独编写代码。这大大减少了重复的代码,并提高了开发效率。
  • 提高代码可维护性:模板和泛型允许程序员将算法和数据结构与具体的类型分离,使得代码更加模块化。这使得代码更容易理解和维护,因为主要的逻辑被封装在独立的、可重用的组件中,而不是分散在大量的特定类型代码中。
  • 提供更好的类型安全:模板和泛型在编译时进行类型检查,这有助于在早期阶段发现并修复错误,而不是等到运行时才发现。这大大提高了代码的可靠性。
  • 提高性能:虽然泛型在运行时可能会引入一些性能开销,但通过使用泛型,程序员可以编写出更加通用的算法和数据结构,这些算法和数据结构可以在编译时进行优化,从而在某些情况下提供更好的性能。
  • 支持多范式编程:模板和泛型允许程序员使用多种编程范式,例如面向对象编程、函数式编程等。这使得语言更加灵活,能够更好地满足各种不同的编程需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14:00进去,14:05就出来了,面试问的有点变态。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降40…

Jarvis步进法(Jarvis March)凸包算法

Jarvis步进法&#xff08;也称为包裹法&#xff09;&#xff1a; Jarvis步进法是一种逐步选择凸包顶点的算法。从点集中选择一个起始点&#xff0c;然后在每一步中选择下一个顶点&#xff0c;该顶点是当前点集中与当前点形成的线段上&#xff0c;极角最小的点。该算法的时间复杂…

【深度学习:数据增强】计算机视觉中数据增强的完整指南

【深度学习&#xff1a;数据增强】计算机视觉中数据增强的完整指南 为什么要做数据增强&#xff1f;等等&#xff0c;什么是数据增强&#xff1f;数据增强技术数据增强的注意事项和潜在陷阱什么时候应该做数据增强&#xff1f;类不平衡的数据增强那么我应该选择哪些转换呢&…

图像分类任务的可视化脚本,生成类别json字典文件

1. 前言 之前的图像分类任务可视化&#xff0c;都是在train脚本里&#xff0c; 用torch中dataloader将图片和类别加载&#xff0c;然后利用matplotlib库进行可视化。 如这篇文章中&#xff1a;CNN 卷积神经网络对染色血液细胞分类(blood-cells) 在分类任务中&#xff0c;必定…

如何在一张图里同时显示两个三维图

import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dplt.rcParams["font.sans-serif"] ["SimHei"]# 正确显示中文和负号 plt.rcParams["axes.unicode_minus"] False# 创建数据 x np.random.rand(50…

就是要你懂网络--一个网络包的旅程

原文地址:https://plantegg.github.io/2019/05/15/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82%E7%BD%91%E7%BB%9C–%E4%B8%80%E4%B8%AA%E7%BD%91%E7%BB%9C%E5%8C%85%E7%9A%84%E6%97%85%E7%A8%8B/ 写在最前面的 我相信你脑子里关于网络的概念都在下面这张图上&#xff0c…

重新认识Elasticsearch-一体化矢量搜索引擎

前言 2023 哪个网络词最热&#xff1f;我投“生成式人工智能”一票。过去一年大家都在拥抱大模型&#xff0c;所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES&#xff0c;用上好久为碰的RestHighLevelClient包。心血…

深度解析高防产品---高防CDN

高防CDN是一种基于云计算技术的网络安全防御系统&#xff0c;通过在全球范围内部署多个节点&#xff0c;实现对网站内容的加速和保护。其主要作用和功能包括安全防护、加速访问、跨运营商、跨地域的全网覆盖、提高网站的稳定性以及节约成本。高防CDN可以有效地解决不同地区的网…

构建自己的私人GPT-支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…

dubbo与seata集成

1.seata是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional&#xff1a;全局事务注解&#xff0c;添加了以后可实现分布式事务的回滚和提交&#xff0c;用法与spring…

了解什么是UV纹理?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 什么是UV&#xff1f; UV 是与几何图形的顶点信息相对应的二维纹理坐…

基于GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接&#xff1a;基于ChatGPT4Python近红外光谱数据分析及机器学习与深度学习建模教程 第一&#xff1a;GPT4基础 1、ChatGPT概述&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验&#xff08;注册与充值、购买方法&am…

ESP32_ADC(Arduino)

ADC模数转换 ESP32集成了12位的逐次逼近式ADC&#xff0c;分别为ADC1模块ADC2模块&#xff0c;共支持18个模拟输入通道: ADC1模块&#xff1a;8个通道&#xff0c;32~39ADC2模块&#xff1a;10个通道&#xff0c;0&#xff0c;2&#xff0c;4&#xff0c;12 ~ 15&#xff0c;…

iTOP-3A5000开发板28路PCIE、4路SATA、2路USB2.0、2路USB3.0、LAN、RS232、VGAHDMI等

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA…

创建一个郭德纲相声GPTs

前言 在这篇文章中&#xff0c;我将分享如何利用ChatGPT 4.0辅助论文写作的技巧&#xff0c;并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元&#xff0c;很多人并不是天天用GPT&#xff0c;只是偶尔用一下。 如果调用官方的GPT4接口&…

从传统部署到无服务器计算:AI应用在AWS平台上的革新与飞跃

文章目录 《快速构建AI应用–AWS无服务器AI应用实战》内容简介作者简介目录 随着人工智能技术的不断发展&#xff0c;越来越多的企业开始将人工智能应用于各个业务场景&#xff0c;以提高效率、降低成本并创造新的商业模式。然而&#xff0c;传统的人工智能解决方案往往需要大量…

【好玩的开源项目】使用Docker部署briefing视频聊天系统

【好玩的开源项目】使用Docker部署briefing视频聊天系统 一、briefing介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载briefing镜像五、部署briefing速查表5.1 使用dock…

界面组件DevExpress WPF v23.2 - 更轻量级的主题支持

DevExpress WPF Subscription拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExp…

【Python机器学习】用于回归的决策树

用于回归的决策树与用于分类的决策树类似&#xff0c;在DecisionTreeRegressor中实现。DecisionTreeRegressor不能外推&#xff0c;也不能在训练数据范围之外的数据进行预测。 利用计算机内存历史及格的数据进行实验&#xff0c;数据展示&#xff1a; import pandas as pd im…

LeetCode-搜索插入位置(35)

题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路&#xff1a; 给定数组查找指定元素值的…