// https://godbolt.org/z/WqjK31Gn6
// 'Elb' wie zuvor…
template<> struct std::formatter<Elb> {
std::string attribs; // Folge von '%n', '%g', '%e', '%v' und anderem
constexpr auto parse(std::format_parse_context& pctx) {
auto it = std::ranges::find(pctx.begin(), pctx.end(), '}');// suche '}'
attribs = std::string(pctx.begin(), it); // alles speichern
return it; // zeigt auf '}'
}
auto format(const Elb& elb, std::format_context& fctx) const {
auto out = fctx.out(); // hier hinein
for(auto n=0u; n<attribs.size()-1; ++n) {
if(attribs[n] == '%') { // Instruktion, ein Mitglied auszugeben
switch(attribs[++n]) {
case 'n': out = std::format_to(out, "{}", elb.name); break;
case 'g': out = std::format_to(out, "{}", elb.geb); break;
case 'e': out = std::format_to(out, "{}", elb.epoche); break;
case 'v': out = std::format_to(out, "{}", elb.volk); break;
case '%': out = std::format_to(out, "%"); break; // %% wird zu %
}
} else {
out = std::format_to(out, "{}", attribs[n]); // alles andere
}
}
return out; // zeigt ans Ende
}
};
int main() {
Elb e{"Feanor", 1169, "EZ", "Nordor"};
std::cout << std::format("{:Elb %n}", e) << std::endl;
// Ausgabe: Elb Feanor
std::cout << std::format("Elb {:%n, %v, geboren %g im Zeitalter %e}\n", e);
// Ausgabe: Elb Feanor, Nordor, geboren 1169 im Zeitalter EZ
}