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

C++ 自定义字面量

在C++11中,用户自定义字面量(User-Defined Literals)为程序员提供了前所未有的灵活性和便利性,它允许我们根据自己的需求定义字面量,从而使代码更加直观、易读且富有表现力。

什么是用户定义字面量?

在C++中,字面量是程序中直接使用的固定值,它们是源代码中用于表示数据的常量形式。常见的字面量包括整数(如42)、浮点数(如3.14)、字符串(如"hello")等。在C++11之前,这些字面量的类型和值都是预定义好的,程序员无法对其进行自定义。

C++11引入了用户定义的字面量,这一特性允许程序员定义自己的字面量运算符,从而创建具有特定含义和行为的字面量。例如,我们可以定义一个字面量运算符 _km,使得 10_km 不仅是一个数值,而是明确表示10公里的距离。这种自定义字面量的能力,为代码的可读性和可维护性带来了显著提升。

如何定义用户定义字面量?

自定义字面量是通过定义字面量运算符来实现的。字面量运算符是一种特殊的函数,其名称以 operator "" 开头,后面紧跟着一个用户自定义的标识符。这个标识符用于区分不同的字面量运算符,同时也为字面量赋予了特定的语义。

定义数值字面量运算符
  • 数值字面量运算符可以处理整数和浮点数字面量。 
// 定义整数字面量运算符
int operator "" _dozen(unsigned long long d) { return d * 12; 
}

在这个例子中,_dozen 是一个整数字面量运算符。当使用 10_dozen 时,它会将10乘以12,结果为120。这里的参数类型 unsigned long long 是C++11为整数字面量运算符提供的专用类型,它可以确保在编译时捕获整数字面量。

对于浮点数字面量运算符,定义方式类似,但参数类型有所不同。例如:

    // 定义浮点数字面量运算符long double operator "" _percent(long double p) {return p / 100.0;}

_percent 运算符将浮点数字面量转换为百分比形式。使用 50.0_percent 时,结果为0.5。

定义字符串字面量运算符

字符串字面量运算符用于处理字符串字面量。其定义方式与数值字面量运算符略有不同,主要体现在参数类型上。

    std::string operator "" _path(const char* str, size_t len) {return std::string(str, len);}

在这个例子中,_path 是一个字符串字面量运算符。它将字符串字面量转换为 std::string 对象。参数 const char* str 指向字符串字面量的首字符,size_t len 表示字符串的长度。通过这种方式,我们可以方便地创建具有特定路径格式的字符串对象。

用户定义的字面量的用途

用户定义的字面量具有广泛的应用场景,以下是一些常见的用途:

创建更直观的代码

用户定义的字面量可以使代码更加直观和易于理解。例如,在处理时间时,我们可以定义 _min_hour 等字面量运算符:

    int operator "" _min(unsigned long long m) {return m * 60;  // 将分钟转换为秒}int operator "" _hour(unsigned long long h) {return h * 3600;  // 将小时转换为秒}

使用这些字面量运算符,我们可以这样编写代码:

    int timeInSeconds = 30_min + 2_hour;

这样的代码比直接使用数值 30 * 60 + 2 * 3600 更加直观和易于理解。

定义物理单位

在科学计算和工程领域,物理单位的正确使用至关重要。用户定义的字面量可以方便地定义各种物理单位,如长度、质量、时间等:

    long double operator "" _km(long double x) {return x * 1000;  // 将公里转换为米}long double operator "" _kg(long double x) {return x;  // 千克}long double operator "" _s(long double x) {return x;  // 秒}

使用这些字面量运算符,可以编写更具物理意义的代码:

    long double distance = 10.0_km;long double mass = 5.0_kg;long double time = 2.0_s;
定义复数

在数学和工程领域,复数的使用非常广泛。用户定义的字面量可以方便地定义复数字面量:

    #include <complex>std::complex<long double> operator "" _i(long double x) {return std::complex<long double>(0, x);}

使用这个字面量运算符,可以轻松创建复数:

    std::complex<long double> z = 3.0_i;  // z is a complex number 0+3i
定义自定义数据类型

用户定义的字面量还可以用于定义自定义数据类型。例如,我们可以定义一个表示二维坐标的类,并为其定义字面量运算符:

    class Point2D {public:long double x, y;Point2D(long double x, long double y) : x(x), y(y) {}// 其他成员函数...};Point2D operator "" _point(unsigned long long x, unsigned long long y) {return Point2D(x, y);}

使用这个字面量运算符,可以方便地创建 Point2D 对象:

    Point2D p = 3_point_4;  // 创建一个坐标为(3, 4)的点

实例

以下是一些使用用户定义的字面量的实例,这些实例展示了用户定义的字面量在不同场景下的应用。

实例1:定义时间单位
    #include <iostream>int operator "" _min(unsigned long long m) {return m * 60;  // 将分钟转换为秒}int operator "" _hour(unsigned long long h) {return h * 3600;  // 将小时转换为秒}int main() {int timeInSeconds = 30_min + 2_hour;std::cout << "Time in seconds: " << timeInSeconds << std::endl;return 0;}

在这个实例中,我们定义了 _min_hour 两个字面量运算符,用于将分钟和小时转换为秒。然后在 main 函数中,我们使用这些字面量运算符计算总时间(以秒为单位)并输出结果。

实例2:定义物理单位
    #include <iostream>long double operator "" _km(long double x) {return x * 1000;  // 将公里转换为米}long double operator "" _kg(long double x) {return x;  // 千克}long double operator "" _s(long double x) {return x;  // 秒}int main() {long double distance = 10.0_km;long double mass = 5.0_kg;long double time = 2.0_s;std::cout << "Distance in meters: " << distance << std::endl;std::cout << "Mass in kilograms: " << mass << std::endl;std::cout << "Time in seconds: " << time << std::endl;return 0;}

在这个实例中,我们定义了 _km_kg_s 三个字面量运算符,分别用于表示公里、千克和秒。然后在 main 函数中,我们使用这些字面量运算符创建了表示距离、质量和时间的变量,并输出它们的值。

实例3:定义复数
    #include <iostream>#include <complex>std::complex<long double> operator "" _i(long double x) {return std::complex<long double>(0, x);}int main() {std::complex<long double> z = 3.0_i;  // z is a complex number 0+3istd::cout << "Complex number: " << z << std::endl;return 0;}

在这个实例中,我们定义了一个字面量运算符 _i,用于创建复数。然后在 main 函数中,我们使用 3.0_i 创建了一个复数对象 z,并输出其值。

实例4:定义二维坐标
    #include <iostream>class Point2D {public:long double x, y;Point2D(long double x, long double y) : x(x), y(y) {}friend std::ostream& operator<<(std::ostream& os, const Point2D& p) {os << "(" << p.x << ", " << p.y << ")";return os;}};Point2D operator "" _point(unsigned long long x, unsigned long long y) {return Point2D(x, y);}int main() {Point2D p = 3_point_4;  // 创建一个坐标为(3, 4)的点std::cout << "Point: " << p << std::endl;return 0;}

在这个实例中,我们定义了一个 Point2D 类,用于表示二维坐标。然后定义了一个字面量运算符 _point,用于创建 Point2D 对象。在 main 函数中,我们使用 3_point_4 创建了一个坐标为(3, 4)的点,并输出其值。

总结

C++11的用户定义的字面量是一种强大的工具,它为程序员提供了极大的灵活性和便利性。通过定义自己的字面量运算符,我们可以创建更直观、更易读的代码,使代码更具表现力和可维护性。无论是定义物理单位、复数,还是自定义数据类型,用户定义的字面量都能发挥重要作用。掌握这一特性,将有助于提升我们的编程水平和代码质量。

相关文章:

C++ 自定义字面量

在C11中&#xff0c;用户自定义字面量&#xff08;User-Defined Literals&#xff09;为程序员提供了前所未有的灵活性和便利性&#xff0c;它允许我们根据自己的需求定义字面量&#xff0c;从而使代码更加直观、易读且富有表现力。 什么是用户定义字面量&#xff1f; 在C中&…...

2024年面对不确定性

24年处在了十字路口&#xff0c;面对工作、家庭、生活的责任&#xff0c;一切变得不确定了&#xff0c;量子力学给了我们新的认识世界的角度&#xff0c;不确定性才是这个世界的底色&#xff0c;我们怎么选择&#xff1f; 不停的思考 霍金在大设计书中给出了深刻的哲学思想&a…...

Coze插件开发之基于已有服务创建并上架到扣子商店

Coze插件开发之基于已有服务创建并上架到扣子商店 在应用开发中&#xff0c;需要调用各种插件&#xff0c;以快速进行开发。但有时需要调用的插件在扣子商店里没有&#xff0c;那怎么办呢&#xff1f; 今天就来带大家快速基于已有服务创建一个新的插件 简单来讲&#xff0c;就是…...

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…...

企业微信开发009_使用WxJava企业微信开发框架_封装第三方应用企业微信开发002_并且实现多企业授权访问---企业微信开发011

继续接上一节来贴代码: 接下来看 config部分的代码,这部分代码,系统启动的时候,就会执行,从而把配置的一些,配置读取出来,创建,针对每个企业微信的,操作service. 首先看yml配置文件中配置部分: 可以先看一下demo中: 提供了一个配置的示例,当然这个是针对 企业内部自建应用 …...

机器学习 - 初学者需要弄懂的一些线性代数的概念

一、单位矩阵 在数学中&#xff0c;单位矩阵是一个方阵&#xff0c;其主对角线上的元素全为1&#xff0c;其余元素全为0。单位矩阵在矩阵乘法中起到类似于数字1在数值乘法中的作用&#xff0c;即任何矩阵与单位矩阵相乘&#xff0c;结果仍为原矩阵本身。 单位矩阵的定义&…...

【学术会议-第五届机械设计与仿真国际学术会议(MDS 2025) 】前端开发:技术与艺术的完美融合

重要信息 大会官网&#xff1a;www.icmds.net 大会时间&#xff1a;2025年02月28日-03月02日 大会地点&#xff1a;中国-大连 会议简介 2025年第五届机械设计与仿真国际学术会议&#xff08;MDS 2025) 将于2025年02月28-3月02日在中国大连召开。MDS 2025将围绕“机械设计”…...

RabbitMQ 分布式高可用

文章目录 前言一、持久化与内存管理1、持久化机制2、内存控制1、命令行2、配置文件 3、内存换页4、磁盘控制 二、集群1、Erlang的分布式特性2、RabbitMQ的节点类型2.1、磁盘节点 (Disk Node)2.2、内存节点 (RAM Node) 3、构建集群3.1 普通集群3.2 镜像队列3.3、高可用实现方案3…...

海康工业相机 SDK对接 Hikvision

有C#基础的&#xff0c;可以参考下&#xff0c;直接上代码 BaseResult 来自于Nuget包&#xff0c;搜Rotion可以搜出来 LS.Standard.Data 海康的接口操作&#xff0c;要先引用相应的dll using MvCamCtrl.NET; using PCZD.Commons.Data.CameraModel; using PCZD.Data; using Sys…...

开发技巧,vue 中的动态组件的引用 component + is

在项目中很多时候有切换 tab 的场景&#xff0c;一般来说都是用 v-if 或者 v-show 然后根据各种条件来控制显示隐藏。 其实我们可以使用 vue 中的动态组件&#xff0c;也能实现这个效果 <!-- currentTab 改变时组件也改变 --> <component :is"currentTab"…...

MySQL 二进制安装(正式篇)

Author&#xff1a;Arsen Date&#xff1a;2025/01/24 官方参考文档&#xff1a;点击链接跳转 目录 规划下载安装管理FAQ 规划 OSMySQL Server Version备注CentOS 7.9 or Linux - Generic8.0.33(GNU libc) 2.17 下载 二进制包下载地址&#xff1a;https://downloads.mysql.…...

MongoDB 数据库备份和恢复全攻略

在当今数据驱动的时代&#xff0c;数据库的稳定运行和数据安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库&#xff0c;以其灵活的文档模型和高扩展性备受青睐。然而&#xff0c;无论数据库多么强大&#xff0c;数据丢失的风险始终存在&#xff0c;因此掌握 MongoDB 的备份…...

K8S部署DevOps自动化运维平台

持续集成&#xff08;CI&#xff09; 持续集成强调开发人员提交了新代码之后&#xff0c;立刻自动的进行构建、&#xff08;单元&#xff09;测试。根据测试结果&#xff0c;我 们可以确定新代码和原有代码能否正确地集成在一起。持续集成过程中很重视自动化测试验证结果&#…...

工业相机 SDK 二次开发-Sherlock插件

本文介绍了 sherlock 连接相机时的插件使用。通过本套插件可连接海康的工业相机。 一&#xff0e;环境配置 1. 拷贝动态库 在用户安装 MVS 目录下按照如下路径 Development\ThirdPartyPlatformAdapter 找到目 录为 DalsaSherlock 的文件夹&#xff0c;根据 Sherlock 版本找到…...

分布式版本控制系统:Git

1 Git概述 Git官网&#xff1a;https://git-scm.com/ Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。它具有廉价的本地库、方便的暂存区域和多个工作流分支等特性…...

页高速缓存与缓冲区缓存的应用差异

页高速缓存&#xff08;Page Cache&#xff09;与缓冲区缓存&#xff08;Buffer Cache&#xff09;是计算机系统中用于提高数据访问性能的两种不同类型的缓存机制&#xff0c;它们的差异主要体现在以下几个方面&#xff1a; 缓存目的 页高速缓存&#xff1a;主要用于加速对磁…...

C语言编程笔记:文件处理的艺术

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分…...

如何编写一个MyBatis插件?

大家好&#xff0c;我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助&#xff1b; 如何编写一个MyBatis插件&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 编写 MyBatis 插件需要使用 MyBatis 提供的插件接口&#xff0c;MyBa…...

验证二叉搜索树(力扣98)

根据二叉搜索树的特性&#xff0c;我们使用中序遍历&#xff0c;保证节点按从小到大的顺序遍历。既然要验证&#xff0c;就是看在中序遍历的条件下&#xff0c;各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题&#xff0c;一个指针指向当前节点&#…...

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过C语言解决。 输入描述&#xff1a;Lily使用的图片包括 “A…...

Golang Gin系列-7:认证和授权

在本章中&#xff0c;我们将探讨Gin框架中身份验证和授权的基本方面。这包括实现基本的和基于令牌的身份验证&#xff0c;使用基于角色的访问控制&#xff0c;应用中间件进行授权&#xff0c;以及使用HTTPS和漏洞防护保护应用程序。 实现身份认证 Basic 认证 Basic 认证是内置…...

mysql create table的用法

在MySQL中创建表的基本语法如下&#xff1a; CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,... );这里是一个例子&#xff0c;假设我们要创建一个名为employees的表&#xff0c;包含以下字段&#xff1a; id&#xff1a;一个整数类型的主键…...

蓝桥杯算法赛第25场月赛

前言 这些题对于我的难度有点大&#xff0c;大家感兴趣的可以来做一下&#xff0c;看一下&#xff0c;下面给大家展示一下题目 1. 桃花运走向【算法赛】 问题描述 2025 年春节&#xff0c;小明和小红兴致勃勃地去庙会玩耍。庙会上&#xff0c;一个算命先生摆摊算命&#xf…...

从介词到状语 (什么都研究一点系列)

契子 英语中介词的使用频率很高, 但在使用时本质上作为状语而成为句子成分, 没错 “本质上” 这三个字就是状语 &#x1f603; 形式上是这样: 介词 -> 状语 -> 句子 常见的介词: 时间 at, 地点 on, 原因 of, 方式 in, 伴随 with, 比较 than, 条件 if 等等 下面我们开…...

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 此漏洞 &#xff08;CVSS SCORE 7.0&#xff09; 允许远程攻击者绕…...

java入门笔记基础语法篇(4)

变量 在Java中&#xff0c;每个变量都有一个类型&#xff08;type&#xff09;。在声明变量时&#xff0c;变量的类型位于变量 名之前。例如&#xff1a; int days; double salary; long earthPopulation; boolean done; 在Java中&#xff0c;每个声明以分号结束。变量名必须…...

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…...

存储基础 -- SCSI命令格式与使用场景

SCSI命令格式与使用场景 1. SCSI命令描述符块&#xff08;CDB&#xff09; 1.1 CDB基本概念 SCSI命令通过**命令描述符块&#xff08;CDB, Command Descriptor Block&#xff09;**表示。 CDB长度&#xff1a;SCSI命令根据使用场景有不同长度的CDB&#xff0c;常见的有6字节…...

PyTorch广告点击率预测(CTR)利用深度学习提升广告效果

目录 广告点击率预测问题数据集结构广告点击率预测模型的构建1. 数据集准备2. 构建数据加载器3. 构建深度学习模型4. 训练与评估 总结 广告点击率预测&#xff08;CTR&#xff0c;Click-Through Rate Prediction&#xff09;是在线广告领域中的重要任务&#xff0c;它帮助广告平…...

算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…...