Modernes C++ programmieren

Okt 23, 2024

lst-0851-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/scE81KfEa 
#include <iostream>
#include <vector>
#include <list>
#include <ranges>
namespace rs = std::ranges;

template<rs::range R>
void alg(R&& range) {
  if constexpr(rs::random_access_range<R>)
    std::cout << "wahlfrei.\n";
  else if constexpr(rs::bidirectional_range<R>)
    std::cout << "bidirektional, aber nicht wahlfrei\n";
  else static_assert(false, "nicht unterstützter Range-Typ");
}
int main() {
    std::vector<int> vec {};       // vector ist wahlfrei
    alg(vec);
    std::list<int> lst;            // list ist nur bidirektional
    alg(lst);
    std::istreambuf_iterator<char> i1{std::cin}, i2{}; // nicht einmal bidirektional
    auto fwd = rs::subrange{i1, i2};
    alg(fwd); //             (ERR)  Fehler: keine passende Implementierung
}