How do I assert a type is a range in C++?

How can I ensure my custom type is a valid range in C++?

To ensure your custom type is a valid range, you can use static_assert along with concepts from the <ranges> header in C++20.

This allows you to check that your type meets the criteria for being a range. Here's how you can assert that a type is a random access range and a contiguous range:

#include <vector>
#include <ranges>
#include <string>

class Player {
public:
  Player(std::string Name) : mName(Name) {}
  std::string GetName() const { return mName; }
private:
  std::string mName;
};

class Party {
public:
  void AddMember(const std::string& NewMember) {
    PartyMembers.emplace_back(NewMember);
  }

  auto begin() {
    return PartyMembers.begin();
  }
  
  auto end() {
    return PartyMembers.end();
  }

private:
  std::vector<Player> PartyMembers;
};

static_assert(std::ranges::random_access_range<Party>);
static_assert(std::ranges::contiguous_range<Party>);

int main() {
  Party MyParty;
  MyParty.AddMember("Legolas");
  MyParty.AddMember("Gimli");
  MyParty.AddMember("Frodo");

  for (const auto& Player : MyParty) {
    std::cout << Player.GetName() << '\n';
  }
}
Legolas
Gimli
Frodo

This ensures that if any future changes to Party violate the range requirements, you'll be alerted during compilation.

Implementing Ranges for Custom Types

Learn to implement iterators in custom types, and make them compatible with range-based techniques.

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Implementing Iterators in Custom Types
How can I implement iterators for my custom types in C++?
What are iterator types in C++?
What are iterator types in C++ and how do I use them?
How to use range-based for loops in C++?
How can I use range-based for loops with my custom types in C++?
How to create a custom collection with iterators in C++?
How do I create a custom collection with iterators in C++?
How to use concepts with custom ranges in C++?
How can I use concepts to ensure my custom type is a valid range in C++?
Or Ask your Own Question
Get an immediate answer to your specific question using our AI assistant