std::format格式化自定义类型
示例代码#
#include <string>
#include <iostream>
// 导入format
#include <format>
struct Vector4D
{
int x, y, z, s;
};
// std::formatter格式化Vector4D
namespace std {
template <>
class formatter<Vector4D> {
public:
explicit formatter() noexcept
: _fmt(OutputFormat::XYZS)
{ }
typename std::basic_format_parse_context<char>::iterator
parse(std::basic_format_parse_context<char>& pc) {
if (pc.begin() == pc.end() || *pc.begin() == '}') {
_fmt = OutputFormat::XYZS;
return pc.end();
}
switch (*pc.begin()) {
case 'X':
_fmt = OutputFormat::X;
break;
case 'Y':
_fmt = OutputFormat::Y;
break;
case 'Z':
_fmt = OutputFormat::Z;
break;
case 'S':
_fmt = OutputFormat::S;
default:
throw std::format_error("Invalid format specification");
}
return pc.begin() + 1;
}
template <typename OutputIt>
std::basic_format_context<OutputIt, char>::iterator
format(const Vector4D& value, std::basic_format_context<OutputIt, char>& fc) const noexcept {
std::string valueString;
switch (_fmt) {
case OutputFormat::XYZS: {
valueString = std::format("X={}, Y={}, Z={}, S={}",
value.x, value.y, value.z, value.s);
break;
}
case OutputFormat::X:
valueString = std::format("X={}", value.x);
break;
case OutputFormat::Y:
valueString = std::format("Y={}", value.y);
break;
case OutputFormat::Z:
valueString = std::format("Z={}", value.z);
break;
case OutputFormat::S:
valueString = std::format("S={}", value.s);
break;
}
auto output = fc.out();
for (auto ch : valueString) {
*output++ = ch;
}
return output;
}
private:
enum class OutputFormat {
X,
Y,
Z,
S,
XYZS
};
OutputFormat _fmt;
};
} // namespace std
int main()
{
Vector4D v = { 1, 2, 3, 4 };
std::cout << std::format("{}", v) << std::endl;
return 0;
}
作者:Esofar
出处:https://www.cnblogs.com/WindSnowLi/p/16998153.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)