//#(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
}