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.
Answers to questions are automatically generated and may not have been reviewed.
Learn to implement iterators in custom types, and make them compatible with range-based techniques.