C++ 语言特性21 - 别名模板
一:概述
别名模板是 C++11 引入的,用于为一个模板类型定义别名,从而简化复杂的模板类型定义。它结合了 using 关键字,可以对模板类型进行重新命名,使代码更加简洁和可读。
1. 作用
- 定义模板类型的别名。
- 简化复杂的模板类型,如容器、指针等。
2. 语法
template<typename T>
using AliasName = ExistingType<T>;//例子
#include <vector>// 将 std::vector<T> 别名为 Vec<T>
template<typename T>
using Vec = std::vector<T>;int main() {Vec<int> v = {1, 2, 3}; // 实际上是 std::vector<int>
}//Vec<int> 是 std::vector<int> 的别名,通过别名模板,代码变得更加简洁。
二:使用场景
1. 简化复杂类型:如果某个模板类型嵌套得非常深,用别名模板可以减少冗长的代码
template<typename T>
using MapType = std::map<std::string, std::vector<T>>;
2. 自定义智能指针:使用别名模板可以为智能指针(如 std::shared_ptr 和 std::unique_ptr)创建易于使用的别名。
template<typename T>
using Ptr = std::shared_ptr<T>;Ptr<int> p = std::make_shared<int>(42);
3. 替代 typedef:别名模板可以完全替代传统的 typedef,尤其是在处理模板类型时。
typedef std::vector<int> VecInt; // 传统的 typedef
using VecIntAlias = std::vector<int>; // 别名模板(推荐方式)
三:与 typedef 的对比
1. typdef 语法
typedef 是 C++98 及更早版本中定义类型别名的方式。
typedef ExistingType NewType;//例子
typedef int Integer; // 将 int 定义为 Integer
typedef int* IntPtr; // 将 int* 定义为 IntPtrInteger a = 10;
IntPtr p = &a;
2.typedef 特点
- 简单类型别名:
typedef可以为基本类型、指针、函数指针、数组等定义别名。 - 语法复杂:
typedef在面对复杂的类型声明时,语法显得比较繁琐且不直观。例如函数指针的typedef语法容易混淆。
3.typedef 局限性
- 不支持模板:
typedef无法与模板配合使用,无法定义模板类型的别名。
4. 使用建议
在现代 C++ 中,推荐使用 using 来替代 typedef,因为它的语法更简洁明了,但在现代项目中,typedef 基本已被 using 所取代。
四:与 typename 的对比
typename 是一个用于声明模板参数或在模板中指定嵌套依赖类型的关键字。它的主要作用是告诉编译器:某个标识符是一个类型而非变量或其他东西。typename 在模板编程中非常重要,用于区分嵌套依赖类型(dependent type)和其他非类型成员。
1. typename 作用
- 声明模板参数:作为类型声明的一部分,表明这是一个类型。
- 解决依赖类型问题:当类型依赖于另一个模板参数时,
typename用于明确告知编译器该标识符是类型而非变量
2. typename 语法
template<typename T>
class MyClass {
public:typename T::NestedType member; // 声明嵌套类型
};
template<typename T>
class MyClass {
public:typename T::value_type getValue(T container) {return container[0];}
};int main() {std::vector<int> vec = {1, 2, 3};MyClass<std::vector<int>> obj;int value = obj.getValue(vec);
}//在这个例子中,T::value_type 是一个依赖类型,使用 typename 明确告诉编译器它是一个类型。
3. 何时需要使用 typename
当在模板类或函数中使用某个依赖类型时,必须用 typename 来告知编译器这个符号是类型而不是变量或函数名。例如
template<typename T>
void func() {typename T::value_type x; // T::value_type 是依赖于模板参数 T 的类型
}//如果省略 typename,编译器会认为 T::value_type 是一个静态成员,而非类型,从而导致编译错误。
4. 使用场景
- 使用别名模板:当你希望简化复杂的模板类型定义,或为模板类/函数提供更简洁的命名时,使用别名模板。
- 使用
typename:当你在模板中遇到依赖类型时(尤其是在嵌套模板结构中),使用typename来帮助编译器正确解析这个符号为类型。
// 使用别名模板简化模板类型
template<typename T>
using Ptr = std::shared_ptr<T>;// 使用 typename 解决依赖类型问题
template<typename T>
void func() {typename T::NestedType x; // T::NestedType 是依赖类型
}//总之,别名模板用于为模板类型定义别名,简化代码,而 typename 则用于在模板中声明某个标识符为类型,尤其是在处理依赖类型时显得尤为重要。
相关文章:
C++ 语言特性21 - 别名模板
一:概述 别名模板是 C11 引入的,用于为一个模板类型定义别名,从而简化复杂的模板类型定义。它结合了 using 关键字,可以对模板类型进行重新命名,使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…...
Jenkins pipeline配置示例
前提条件:已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考: 1.创建pipeline 点击新建项目: 输入名称,选择pipeline: 进入配置页面,如果要配置GitHub Webhook要勾选:<fo…...
Navicat for MySQL 常见问题
一、 创建连接失败问题 创建连接后,报错:1251 -Client does not support authentication protocal by server;consider upgrading MySQL client 原因:环境冲突 解决办法 : windowsR 打开 services.msc 找S开头:SQ…...
Windows:win11旗舰版连接无线显示器,连接失败
摘要:win11系统通过 miracast 无线连接到长虹电视的时候,一直连接不上。查看电脑又是支持 miracast 协议,后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视,打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…...
Android2024.2.1升级错误
提示 Gradle 版本不兼容,升级后就报错了 。 1.gradle安装包镜像 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencen…...
【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势
陪玩系统开发运营级别陪玩成品搭建 支持二开源码交付,游戏开黑陪玩系统: 多客陪玩系统,游戏开黑陪玩,线下搭子,开黑陪玩系统 前端uniapp后端php,数据库MySQL 1、长时间的陪玩APP源码开发经验,始终坚持从客户…...
Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:在学习了Arduino的相关基础知识后,现在做个综合应用,给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …...
ChatGPT全新功能Canvas上线:开启智能编程与写作新篇章
引言 随着人工智能技术的迅猛发展,OpenAI旗下的明星产品ChatGPT不断推出创新功能,以满足用户在各个领域的需求。2024年10月3日,OpenAI正式宣布了ChatGPT的全新功能——Canvas。这一功能基于先进的GPT-4o模型开发,为用户提供了一个…...
南沙C++信奥赛陈老师解一本通题 2005:【20CSPJ普及组】直播获奖
【题目描述】 NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%w%,即当前排名前 w%w% 的选手的最低成绩就是即时的分数线。 更具体地,若当前已评出了 pp 个选手的…...
Llama 3.2 视觉能力评估
Meta 发布了 Llama 3 模型的新版本;这次,有四种模型用于不同的目的:两个多模态模型,Llama 3.2 11B 和 90B,以及两个用于边缘设备的小型语言模型,1B 和 3B。 这些是 Meta AI 的首批多模态模型,基…...
前端性能优化 面试如何完美回答
前言 性能优化是目前在面试中被问到非常多的问题,主要就是通过各种算和技术来提高页和应用的速度和用户体前端性能优化的问题并不好回答 在回答的时候干万不要掉进一个误区,认为性能优化只是几个技术点而已,事实上性能优化涉及到的是多方面的…...
程序猿成长之路之设计模式篇——设计模式简介
无论是对于代码质量还是代码可维护性、可扩展性,使用合适的设计模式都能够起到促进提升的作用,此外在软考的软件工程师、系统架构师职称考试中,设计模式也是必考的一块内容,因此我打算开拓一个新的专栏简单介绍一下设计模式&#…...
基于Node2Vec的图嵌入实现过程
目录 一、引言二、Node2Vec(原理)2.1 随机游走(Random Walk)2.2 嵌入学习2.3 Node2Vec 的优势 三、使用 Node2Vec 进行图嵌入(实践)3.1 读取和转换 JSON 文件为 Graph 对象3.2 训练 Node2Vec 模型3.3 二维嵌…...
国庆刷题(day4)
C语言: C:...
如何在 Python 3 中制作一个计算器程序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Python 编程语言是处理数字和求解数学表达式的强大工具。这种特性可以用来制作有用的程序。 本教程介绍了如何在 Python 3 中制作…...
搭建shopify本地开发环境
虽然shopify提供了在线编辑器的功能,但是远不及本地编辑器方便高效,这篇文章主要介绍如何在本地搭建shopify开发环境: 1、安装nodejs 18.2 2、安装git 3、安装shopify cli ,使用指令: npm install -g shopify/clilatest 4、安装ruby 5、…...
【在Linux世界中追寻伟大的One Piece】进程信号
目录 1 -> 信号入门 1.1 -> 生活角度的信号 1.2 -> 技术应用角度的信号 1.3 -> 注意 2 -> 信号的概念 2.1 -> 用kill -l命令可以查看系统定义的信号列表 2.2 -> 信号处理常见方式 3 -> 产生信号 3.1 -> Core Dump 3.2 -> 调用系统函数…...
MySQL中NULL值是否会影响索引的使用
MySQL中NULL值是否会影响索引的使用 为何写这一篇文章 🐭🐭在面试的时候被问到NULL值是否会走索引的时候,感到有点不理解,于是事后就有了这篇文章 问题: 为name建立索引,name可以为空select * from user …...
Chrome 浏览器:现代网络浏览的先锋
Chrome 浏览器:现代网络浏览的先锋 Chrome 浏览器,由谷歌公司开发的一款快速、简单且安全的网络浏览器,自2008年发布以来,已经成为全球最受欢迎的浏览器之一。本文将深入探讨 Chrome 浏览器的特点、功能、发展历程以及其对现代网…...
蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)
这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原理蓝牙定位的原理优缺…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
