std::format_to_n, std::format_to_n_result
定义于头文件 <format> |
||
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(1) | (始于 C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(2) | (始于 C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(3) | (始于 C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(4) | (始于 C++20) |
辅助类型 |
||
template< class OutputIt > struct format_to_n_result { |
(5) | (始于 C++20) |
根据格式字符串 fmt 格式化参数 args,并将结果写入输出迭代器 out。最多写入 n 个字符。如果存在 loc,则用于特定于区域设置的格式化。
对于重载 (1,3),令 CharT
为 char;对于重载 (2,4),令 CharT
为 wchar_t。
仅当 OutputIt
满足概念 std::output_iterator<const CharT&> 时,这些重载才参与重载解析。
如果 OutputIt
不符合(满足语义要求)概念 std::output_iterator<const CharT&>,或者对于 Args
中的任何 Ti
,std::formatter<std::remove_cvref_t<Ti>, CharT> 不满足 BasicFormatter 要求,则行为未定义。
std::format_to_n_result
没有基类,或者除了 out、size
和隐式声明的特殊成员函数之外的成员。内容 |
[编辑] 参数
out | - | 指向输出缓冲区的迭代器 | ||||||||||||||||||||||||||||||||||||||||||||||
n | - | 要写入缓冲区的最大字符数 | ||||||||||||||||||||||||||||||||||||||||||||||
fmt | - |
每个替换字段具有以下格式:
1) 没有格式规范的替换字段
2) 带有格式规范的替换字段
| ||||||||||||||||||||||||||||||||||||||||||||||
args... | - | 要格式化的参数 | ||||||||||||||||||||||||||||||||||||||||||||||
loc | - | 用于特定于区域设置的格式化的 std::locale |
[编辑] 返回值
一个 format_to_n_result
,其中 out
成员是超出输出范围末尾的迭代器,而 size
成员是总的(未截断的)输出大小。
[编辑] 异常
传播由格式化程序或迭代器操作抛出的任何异常。
[编辑] 注释
GCC-13.3 之前的 libstdc++ 实现中存在一个 错误,该错误导致 format_to_n_result::out 值报告不正确。
[编辑] 示例
在 Godbolt 的 Compiler Explorer 中:clang (trunk) + libc++, GCC (trunk) + libstdc++。
#include <format> #include <initializer_list> #include <iomanip> #include <iostream> #include <string_view> int main() { char buffer[64]; for (std::size_t max_chars_to_write : {std::size(buffer) - 1, 23uz, 21uz}) { const std::format_to_n_result result = std::format_to_n( buffer, max_chars_to_write, "Hubble's H{2} {3} {0}{4}{1} km/sec/Mpc.", // 24 bytes w/o formatters 71, // {0}, occupies 2 bytes 8, // {1}, occupies 1 byte "\u2080", // {2}, occupies 3 bytes, '₀' (SUBSCRIPT ZERO) "\u2245", // {3}, occupies 3 bytes, '≅' (APPROXIMATELY EQUAL TO) "\u00B1" // {4}, occupies 2 bytes, '±' (PLUS-MINUS SIGN) ); // 24 + 2 + 1 + 3 + 3 + 2 == 35, no trailing '\0' *result.out = '\0'; // adds terminator to buffer const std::string_view str(buffer, result.out); std::cout << "Buffer until '\\0': " << std::quoted(str) << '\n' << "Max chars to write: " << max_chars_to_write << '\n' << "result.out offset: " << result.out - buffer << '\n' << "Untruncated output size: " << result.size << "\n\n"; } }
输出
Buffer until '\0': "Hubble's H₀ ≅ 71±8 km/sec/Mpc." Max chars to write: 63 result.out offset: 35 Untruncated output size: 35 Buffer until '\0': "Hubble's H₀ ≅ 71±8" Max chars to write: 23 result.out offset: 23 Untruncated output size: 35 Buffer until '\0': "Hubble's H₀ ≅ 71�" Max chars to write: 21 result.out offset: 21 Untruncated output size: 35
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
P2216R3 | C++20 | 对于无效的格式字符串,抛出 std::format_error | 无效的格式字符串导致编译时错误 |
P2418R2 | C++20 | 既非 const 可用也非可复制的对象 (例如,类似生成器的对象)不可格式化 |
允许格式化这些对象 |
P2508R1 | C++20 | 此功能没有用户可见的名称 | 名称 basic_format_string 被公开 |
[编辑] 参见
(C++20) |
将参数的格式化表示形式存储在新字符串中 (函数模板) |
(C++20) |
通过输出迭代器写出其参数的格式化表示形式 (函数模板) |
(C++20) |
确定存储其参数的格式化表示形式所需的字符数 (函数模板) |