Modernes C++ programmieren

Okt 23, 2024

lst-0895-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// 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
}