CodeNebula
C++20stladvanced

std::ranges::range (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

The fundamental concept for types supporting range operations -- any type where `std::ranges::begin()` and `std::ranges::end()` produce a valid iterator-sentinel pair.

Real-World Scenario

Write a generic algorithm that works with any container, C-array, or custom range in a data processing pipeline.

Quick Snippet

snippet.cpp
#include <ranges>
#include <vector>

template<std::ranges::range R>
void process(R&& r) {
    for (auto&& elem : r) { /* process element */ }
}

Full Example

ranges_range.cpp
// CodeNebula - C++20 Example: std::ranges::range Concept
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_range.cpp

#include <ranges>
#include <vector>
#include <list>
#include <string>
#include <array>
#include <iostream>

// The std::ranges::range concept checks whether a type provides
// begin() and end() iterators, making it iterable.

// Function constrained to accept only range types
template <std::ranges::range R>
void print_range(const R& r) {
    for (const auto& elem : r) {
        std::cout << elem << " ";
    }
    std::cout << "\n";
}

// Custom type that satisfies ranges::range
struct Countdown {
    int start;
    auto begin() const { return std::views::iota(0, start).begin(); }
    auto end() const { return std::views::iota(0, start).end(); }
};

int main() {
    // Standard containers satisfy ranges::range
    static_assert(std::ranges::range<std::vector<int>>);
    static_assert(std::ranges::range<std::list<double>>);
    static_assert(std::ranges::range<std::string>);
    static_assert(std::ranges::range<std::array<int, 5>>);
    static_assert(std::ranges::range<int[10]>);

    // Non-range types
    static_assert(!std::ranges::range<int>);
    static_assert(!std::ranges::range<double>);

    std::vector<int> vec = {10, 20, 30, 40, 50};
    std::string text = "hello";
    int arr[] = {1, 2, 3, 4};

    std::cout << "Vector: ";
    print_range(vec);

    std::cout << "String: ";
    print_range(text);

    std::cout << "C-array: ";
    print_range(arr);

    // Views are also ranges
    auto evens = vec | std::views::filter([](int x) { return x % 20 == 0; });
    static_assert(std::ranges::range<decltype(evens)>);
    std::cout << "Filtered: ";
    print_range(evens);

    // Custom range type
    Countdown cd{5};
    std::cout << "Countdown: ";
    print_range(cd);

    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_range.cpp