自定义字面量

自定义字面量
苏丙榅1. 自定义字面量
1.1 基本语法
自定义字面量是C++11引入的特性,允许程序员为字面量定义自己的后缀,从而创建具有特定类型和值的对象。它的基本语法如下:
1 | // 定义字面量运算符 |
如果详细进行划分,定义字面量的时候有四种重载形式:
整数字面量
1
2// 整数字面量
ReturnType operator"" _suffix(unsigned long long);浮点数字面量
1
2// 浮点字面量
ReturnType operator"" _suffix(long double);字符字面量
1
2// 字符字面量
ReturnType operator"" _suffix(char);字符串字面量
1
2// 字符串字面量
ReturnType operator"" _suffix(const char*, size_t);
关于自定义字面量后缀的命名必须以下划线(_)开头,标准库提供的字面量不带下划线后缀。
为了便于大家理解,下面的代码中展示了四种参数形式的详细使用方法:
1 |
|
2.2 复合类型自定义字面量
在 C++ 中,自定义字面量允许我们为自定义类型(包括复合类型)创建直观的字面量表示法。这也是通过重载 operator"" 运算符来实现的。
下面代码中实现了一个复数类 Complex 并利用 C++ 的自定义字面量功能,为复数提供了自然的数学表达式语法。
这个类存储了两个 double 类型的浮点数:
real:实部,表示复数的实数部分imag:虚部系数,表示复数虚数部分的系数(真正的虚数部分是imag × i)
1 | // 数学数据和代码之间的对应关系 |
1 |
|
2. C++14 中的自定义字面量
在 C++11 中,只能为以下类型定义自定义字面量:
- 整数:
unsigned long long - 浮点数:
long double - 字符:
char - 字符串:
const char*,size_t(字符串长度)
1 | // 示例 |
C++14 扩展了自定义字面量的功能,表现在一下两个方面。
2.1 原始字面量
原始字面量还是用来处理原始字符序列,和字符串字面量一样,只是不需要指定字符串长度。
1 | // C++14 新增:原始字符序列 |
2.2 标准库内置字面量
C++14 标准库主要在以下几个头文件中引入了内置字面量:
时间字面量 (在
<chrono>中)在 C++ 的
std::chrono中,这些后缀是时间间隔(duration)的用户定义字面量,用于方便地创建时间单位。1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std::chrono_literals; // 或 std::literals::chrono_literals
// 时、分、秒、毫秒、微秒、纳秒
auto sec = 10s; // 10秒 (std::chrono::seconds)
auto ms = 100ms; // 100毫秒 (std::chrono::milliseconds)
auto us = 500us; // 500微秒 (std::chrono::microseconds)
auto ns = 1000ns; // 1000纳秒 (std::chrono::nanoseconds)
auto min = 5min; // 5分钟 (std::chrono::minutes)
auto hour = 2h; // 2小时 (std::chrono::hours)
// 类型安全的运算
auto total = 1h + 30min + 45s + 200ms;
auto half_hour = 0.5h; // 浮点时间字面量后缀 全称 含义 等价于 hhours 小时 std::chrono::hoursminminutes 分钟 std::chrono::minutessseconds 秒 std::chrono::secondsmsmilliseconds 毫秒 std::chrono::millisecondsusmicroseconds 微秒 std::chrono::microsecondsnsnanoseconds 纳秒 std::chrono::nanoseconds字符串字面量 (在
<string>中)使用内置字面量
s可以直接将一个char*字符串转换成std::string类型的对象。1
2
3
4
5
6
7
8
9
10
11
12
13
using namespace std::string_literals; // 或 std::literals::string_literals
auto str1 = "hello"s; // std::string 类型
auto str2 = u"hello"s; // std::u16string
auto str3 = U"hello"s; // std::u32string
auto str4 = L"hello"s; // std::wstring
// 与原始字符串字面量组合使用
auto raw = R"(Line1\nLine2)"s; // 原始字符串 + std::string
// 实际用途
std::string name = "Alice"s + " Smith"s; // 编译时连接复数字面量 (在
<complex>中)在 C++ 中,
std::complex定义了三个方便的虚数字面量后缀::i、if、il1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std::complex_literals; // 或 std::literals::complex_literals
auto c1 = 1.0 + 2i; // std::complex<double>(1.0, 2.0)
auto c2 = 3i; // std::complex<double>(0.0, 3.0)
auto c3 = 4.5f + 5.6if; // std::complex<float>(4.5f, 5.6f)
// 不同类型
auto cf = 1.0f + 2.0if; // std::complex<float>
auto cd = 1.0 + 2.0i; // std::complex<double>
auto cld = 1.0L + 2.0il; // std::complex<long double>
// 数学运算
auto z = (1.0 + 2i) * (3.0 - 4i); // 复数乘法后缀 类型 对应的 std::complex 类型 idoublestd::complex<double>iffloatstd::complex<float>illong doublestd::complex<long double>
关于以上三种预定义字面量的命名空间的使用一般有三种方式:
1 | // 方式1:导入特定字面量 |
| 字面量类型 | 头文件 | 命名空间 | 主要后缀 | 返回类型 |
|---|---|---|---|---|
| 时间字面量 | <chrono> |
std::chrono_literals |
h, min, s, ms, us, ns |
对应的 duration 类型 |
| 字符串字面量 | <string> |
std::string_literals |
s |
std::basic_string 相应类型 |
| 复数字面量 | <complex> |
std::complex_literals |
i, if, il |
std::complex 相应类型 |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果












