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