Modernes C++ programmieren

Okt 23, 2024

lst-0647-book.cpp

// https://godbolt.org/z/orTK9daa3 
#include <concepts>
#include <iostream>
#include <string>
using namespace std; using namespace std::literals;

string mk_string(integral auto val) { return to_string(val); }
string mk_string(string val) { return '['+val+']'; }
template<typename T>
  requires copyable<T> &&                            // Typanforderung
  requires (T t) { mk_string(t) + mk_string(t); } && // einfache Anforderung
  requires (T t) {                     // zusammengesetzte Anforderung
    {mk_string(t)} -> same_as<string>; // gültiger Ausdruck muss Bedingung erfüllen
  }
string dbl_quote(const T& val) {
  T val2{val};                      // Kopie erzeugen (nur zu Demozwecken)
  return '"' + mk_string(val) + mk_string(val2) + '"';
}
int main() {
  cout << dbl_quote(10) << '\n';    // Ausgabe: "1010"
  cout << dbl_quote("ab"s) << '\n'; // Ausgabe: "[ab][ab]"
  cout << dbl_quote(3.14) << '\n';  //                                  (ERR)  Fehler: keine passende mk_string-Überladung
}