说明

std::to_chars

通过成功填充范围 [first, last) ,转换 value 为字符串,要求 [first, last) 是合法范围。
1) 整数格式化函数: value 以给定基底 base 转换成数位的字符串(无冗余的前导零)。范围 10..35 (含上下限)中的数字被表示成小写字母 a..z 。若值小于零,则表示以负号起始。库提供所有有符号及无符号整数和 char 类型作为参数 value 类型的重载。
2) bool 的重载被删除。 to_chars 拒绝 bool 类型参数,因为假如允许则结果会是 “0”/“1” 而非 “false”/“true” 。
3) 如同用 std::sprintf 于默认( “C” )本地环境转换值为字符串。转换指定符是 f 或 e ,根据最短表示方式的要求选择(两者相当时优先选择 f ):字符串表示由小数点(若存在)前至少有一位,且用对应的 std::from_chars 分析该表示能准确恢复值的,最小数量的字符组成。若有数个这种表示,则选择到 value 的差最小者,用根据 std::round_to_nearest 的舍入解决任何剩余倾向
4) 同 (3) ,但若 fmt 为 std::chars_format::fixed 则如同对应 printf 的转换指定为 f ,若 fmt 为 std::chars_format::scientific 则为 e ,若 fmt 为 std::chars_format::hex 则为 a (但结果无前导 “0x” ),且若 fmt 为 chars_format::general 则为 g 。
5) 同 (4) ,除了精度以参数 precision 指定,而非以最短表示要求。
6) 返回类型(见后述返回值)。 std::to_chars_result 无基类或 ptr 、 ec 及隐式声明的特殊成员函数以外的成员。
参数
first, last - 要写入的字符范围
value - 要转换到其字符串表示的值
base - 使用的整数基底: 2 与 36 间的值(含上下限)。
fmt - 使用的浮点格式, std::chars_format 类型的位掩码
precision - 使用的浮点精度
返回值
成功时,返回 to_chars_result 类型的值,其 ec 等于值初始化的 std::errc ,且其 ptr 是指向被写入字符尾后一位置的指针。注意该字符串不是空终止的。
错误时,返回 to_chars_result 类型的值,它在 ec 保有 std::errc::value_too_large 于 ,在 ptr 保有 last ,并于范围 [first, last) 中留下未指定状态的内容。

std::from_chars

按照后述模式分析字符序列 [first,last) 。若无字符匹配模式或若按照分析匹配字符获得的值不能以 value 的类型表示,则不修改 value ,否则将匹配模式的字符转译成算术值的文本表示,并将值存储于 value 。
1) 整数分析函数:期待等同于 std::strtol 于默认( “C” )本地环境所使用者相同的模式,并给定非零整数底,除了
对底 16 不识别 “0x” 或 “0X” 前缀
仅识别负号(不识别正号),而且只针对 value 的有符号整数类型。
库为所有有符号和无符号整数类型和 char 提供重载,这些类型是参数 value 的被引用类型。
2-4) 浮点分析函数:期待期待等同于 std::strtod 于默认( “C” )本地环境所使用者相同的模式,除了
不识别指数外的正号(在起始位置只允许出现负号)
若 fmt 设置了 std::chars_format::scientific 而无 std::chars_format::fixed ,则要求指数部分(否则可选)
若 fmt 设置了 std::chars_format::fixed 而无 std::chars_format::scientific ,则不允许可选的指数部分
若 fmt 为 std::chars_format::hex ,则不允许前缀 “0x” 或 “0X” (字符串 “0x123” 分析为值 “0” 和未分析的剩余 “x123” )。
任何情况下,按照 std::round_to_nearest 舍入后,结果值是至多二个最接近匹配模式的字符串的值的浮点值之一。
5) 返回值类型(见后述返回值)。 std::from_chars_result 无基类或 ptr 、 ec 及隐式声明的特殊成员函数以外的成员。
参数
first, last - 要分析的合法字符范围
value - 存储被分析值的输出参数,若分析成功
base - 使用的整数基底: 2 与 36 间的值(含上下限)。
fmt - 使用的浮点格式, std::chars_format 类型的位掩码
返回值
成功时,返回 from_chars_result 类型的值,其 ptr 指向首个不匹配模式的字符,或若所有字符皆匹配则指向拥有等于 last 的值,其 ec 被值初始化。
若无可匹配的模式,则返回 from_chars_result 类型的值,其 ptr 等于 first 且 ec 等于 std::errc::invalid_argument 。不修改 value 。
若模式匹配,但被分析值不在 value 的类型所表示的范围内,则返回 from_chars_result 类型的值,其 ec 等于 std::errc::result_out_of_range 且 ptr 指向首个不匹配模式的字符。不修改 value 。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <charconv>
#include <system_error>
#include <string_view>
#include <array>


struct StructBind {
int a;
std::string b;
};

StructBind Test(const int a, const std::string& b)
{
StructBind ss;
ss.a = a;
ss.b = b;
return ss;
}

/*
std::to_chars
通过成功填充范围 [first, last) ,转换 value 为字符串,要求 [first, last) 是合法范围。
1) 整数格式化函数: value 以给定基底 base 转换成数位的字符串(无冗余的前导零)。范围 10..35 (含上下限)中的数字被表示成小写字母 a..z 。若值小于零,则表示以负号起始。库提供所有有符号及无符号整数和 char 类型作为参数 value 类型的重载。
2) bool 的重载被删除。 to_chars 拒绝 bool 类型参数,因为假如允许则结果会是 "0"/"1" 而非 "false"/"true" 。
3) 如同用 std::sprintf 于默认( "C" )本地环境转换值为字符串。转换指定符是 f 或 e ,根据最短表示方式的要求选择(两者相当时优先选择 f ):字符串表示由小数点(若存在)前至少有一位,且用对应的 std::from_chars 分析该表示能准确恢复值的,最小数量的字符组成。若有数个这种表示,则选择到 value 的差最小者,用根据 std::round_to_nearest 的舍入解决任何剩余倾向
4) 同 (3) ,但若 fmt 为 std::chars_format::fixed 则如同对应 printf 的转换指定为 f ,若 fmt 为 std::chars_format::scientific 则为 e ,若 fmt 为 std::chars_format::hex 则为 a (但结果无前导 "0x" ),且若 fmt 为 chars_format::general 则为 g 。
5) 同 (4) ,除了精度以参数 precision 指定,而非以最短表示要求。
6) 返回类型(见后述返回值)。 std::to_chars_result 无基类或 ptr 、 ec 及隐式声明的特殊成员函数以外的成员。
参数
first, last - 要写入的字符范围
value - 要转换到其字符串表示的值
base - 使用的整数基底: 2 与 36 间的值(含上下限)。
fmt - 使用的浮点格式, std::chars_format 类型的位掩码
precision - 使用的浮点精度
返回值
成功时,返回 to_chars_result 类型的值,其 ec 等于值初始化的 std::errc ,且其 ptr 是指向被写入字符尾后一位置的指针。注意该字符串不是空终止的。
错误时,返回 to_chars_result 类型的值,它在 ec 保有 std::errc::value_too_large 于 ,在 ptr 保有 last ,并于范围 [first, last) 中留下未指定状态的内容。

std::from_chars
按照后述模式分析字符序列 [first,last) 。若无字符匹配模式或若按照分析匹配字符获得的值不能以 value 的类型表示,则不修改 value ,否则将匹配模式的字符转译成算术值的文本表示,并将值存储于 value 。
1) 整数分析函数:期待等同于 std::strtol 于默认( "C" )本地环境所使用者相同的模式,并给定非零整数底,除了
对底 16 不识别 "0x" 或 "0X" 前缀
仅识别负号(不识别正号),而且只针对 value 的有符号整数类型。
库为所有有符号和无符号整数类型和 char 提供重载,这些类型是参数 value 的被引用类型。
2-4) 浮点分析函数:期待期待等同于 std::strtod 于默认( "C" )本地环境所使用者相同的模式,除了
不识别指数外的正号(在起始位置只允许出现负号)
若 fmt 设置了 std::chars_format::scientific 而无 std::chars_format::fixed ,则要求指数部分(否则可选)
若 fmt 设置了 std::chars_format::fixed 而无 std::chars_format::scientific ,则不允许可选的指数部分
若 fmt 为 std::chars_format::hex ,则不允许前缀 "0x" 或 "0X" (字符串 "0x123" 分析为值 "0" 和未分析的剩余 "x123" )。
任何情况下,按照 std::round_to_nearest 舍入后,结果值是至多二个最接近匹配模式的字符串的值的浮点值之一。
5) 返回值类型(见后述返回值)。 std::from_chars_result 无基类或 ptr 、 ec 及隐式声明的特殊成员函数以外的成员。
参数
first, last - 要分析的合法字符范围
value - 存储被分析值的输出参数,若分析成功
base - 使用的整数基底: 2 与 36 间的值(含上下限)。
fmt - 使用的浮点格式, std::chars_format 类型的位掩码
返回值
成功时,返回 from_chars_result 类型的值,其 ptr 指向首个不匹配模式的字符,或若所有字符皆匹配则指向拥有等于 last 的值,其 ec 被值初始化。
若无可匹配的模式,则返回 from_chars_result 类型的值,其 ptr 等于 first 且 ec 等于 std::errc::invalid_argument 。不修改 value 。
若模式匹配,但被分析值不在 value 的类型所表示的范围内,则返回 from_chars_result 类型的值,其 ec 等于 std::errc::result_out_of_range 且 ptr 指向首个不匹配模式的字符。不修改 value 。
*/


int main()
{
std::array<char, 10> str;
// c++ 17 if ( ; )
int a{ 1 }, b{ 0 };
if (a = b; 0 == a)
std::cout << "a:"<<a <<", b:" << b << "\n";
// c++17
auto [c, d] = Test(1, "2");
std::cout << "c:" << c << ", d:"<<d << "\n";
// 进阶版
// to_chars
if (auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), 255, 16); ec == std::errc())
{
std::cout << "str:\t" << std::string_view(str.data(), p - str.data()) << "\n";
}
std::array<char, 10> str2{"123.456"};
double value{ 0 };
// from_chars
if (auto [p, ec] = std::from_chars(str2.data(), str2.data() + str2.size(), value, std::chars_format::general); ec == std::errc())
{
std::cout << "value:\t" << value << "\n";
}
return 0;
}

输出

1
2
3
4
a:0, b:0
c:1, d:2
str: ff
value: 123.456

参考

https://zh.cppreference.com/w/cpp/utility/from_chars

https://zh.cppreference.com/w/cpp/utility/to_chars