编程学习
C++11用户定义字面量
00 分钟
2023-7-11
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛

引入

也许你会有这样的想法:如果能在某个数字的后面加个小尾巴就好了,比如:
  • 1cm:代表1厘米
  • 1m:代表1米
  • 1h:代表1小时
实际上C++已经给出了我们有关时间的表示:
需要包含以下的头文件chrono 就是一个时间库
如果我们想要知道能在后面加上小尾巴的原因是什么,我们可以查看其源码:
我们可以发现:
  • h:operator"" h
  • min:operator"" min
  • 对于其他的也是类似。
通过这个方法我们就可以为我们的变量加上一个小尾巴,注意一定是字面量才有效。
如何定义我们自己的字面量呢?

语法

operator”” 用户自定义符号
即:
  • operator””_z:1_z
  • operator””_houzhui:12323_houzhui
我们一定要在 ”” 的后面加上一个 _ 因为不加下划线的是系统保留的,例如上面的时间等。
所以我们用户自定义时一定要加上一个_ 然后后面加上修饰的文本内容。
这是一个最简单的字面值运算符的函数:
  • 使用:auto af = 3.1415_f;
  • 使用:auto as = 12_fs;
  • 使用:auto str = "ylhwoaini"_S;
  • 使用:12345_println;

规则

字面量运算符函数的参数一定要遵循下面的几种方法。
简单来说:
  • 整数:unsigned long long
  • 浮点数:long double
  • 字符串const char* str,std::size_t
  • 字符:char
  • 备用方式:const char*
notion image
注意字符串的类型一定是这两个参数的方式,如果我们使用const char* 类型的参数,则出现报错:
一个参数的const char* 是浮点或者整数的备用情况。
如果存在unsigned long long则优先匹配整数;如果存在 long double,则优先匹配浮点数,如果都不存在,则使用const char* 版本。

示例

角度转换为弧度

使用constexpr可以在编译时确定。
std::numbers::pi 在<numbers>库中

直接 打印

我们采用:123_println的方式直接打印,则返回类型是void类型
字面值运算符可以进行重载
下面是针对常用类型的特化。
notion image

翻倍

使用这种方法来实现对一个string的翻倍
有趣的是多个字符串还可以进行拼接:
相当于 “ylhylh”_s2,前一个的_s2可以省略

参考自:

评论
  • Twikoo
  • Valine