Modernes C++ programmieren

Okt 20, 2024

lst-0008-book.cpp

// https://godbolt.org/z/rqz1s6h11
#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 << "random access.\n";
  else if constexpr(rs::bidirectional_range<R>)
    std::cout << "bidirectional, but not random access\n";
  else static_assert(false, "unsupported range type");
}
int main() {
    std::vector<int> vec {};        // vector is random access
    alg(vec);
    std::list<int> lst;             // list is only bidirectional
    alg(lst);
    std::istreambuf_iterator<char> i1{std::cin}, i2{}; // not even bidirectional
    auto fwd = rs::subrange{i1, i2};
    alg(fwd);                       // (ERR) Error: no matching implementation
}