Modernes C++ programmieren

Okt 23, 2024

lst-0843-book.cpp

// https://godbolt.org/z/dfoorEdYT 
#include <ranges>
#include <iostream>
#include <string_view>
#include <vector>
using namespace std::literals;
using namespace std; namespace vs = std::views; namespace rs = std::ranges;

// Beispiel 1
class Add_1: public rs::range_adaptor_closure<Add_1> { 
  // von Hilfsklasse ableiten
public:
  template<rs::input_range R>
  constexpr auto operator()(R&& r) const {         // universelle Referenz
    return forward<R>(r)                           // universelle Referenz erhalten
      | vs::transform([](auto i) {return i+1;});   // Ihre Implementierung
  }
};
Add_1 add_1{};                                     // Range-Adapter erzeugen

// Beispiel 2
class Dna_to_rna: public rs::range_adaptor_closure<Dna_to_rna> { // ableiten
public:
  template<rs::input_range R>
  constexpr auto operator()(R&& r) const {         // universelle Referenz
    return forward<R>(r)                           // universelle Referenz erhalten
      | vs::transform([](char c)                   // Ihre Implementierung
      {
        switch(c) {
          case 'T': return 'U';
          case 't': return 'u';
          default: return c;
        }
    });
  }
};
Dna_to_rna dna_to_rna{};                           // Range-Adapter erzeugen
// Beispiele benutzen
int main() {
  vector vec{1, 2, 3, 4, 5};
  for(auto i: vec | add_1)                         // benutzen
    cout << i << ' ';
  cout << '\n';         // Ausgabe: 2 3 4 5 6
  auto telo_rep = "TTAGGGTTAGGGTTAGGGTTAGGGT"sv;
  for(auto c: telo_rep | dna_to_rna)  // benutzen
        cout << c;
  cout << '\n';         // Ausgabe: UUAGGGUUAGGGUUAGGGUUAGGGU
}