All Recipes
Home/Concepts/Advanced Requires Clauses
🎯intermediate

Advanced Requires Clauses

Master complex requirements and nested constraints

Example Code

cpp
#include <concepts>
#include <iostream>
#include <vector>
#include <string>
// Compound requirements
template<typename T>
concept Printable = requires(T t, std::ostream& os) {
{ os << t } -> std::same_as<std::ostream&>;
};
// Nested requirements
template<typename Container>
concept PrintableContainer = requires(Container c) {
{ c.begin() } -> std::input_or_output_iterator;
{ c.end() } -> std::input_or_output_iterator;
requires Printable<decltype(*c.begin())>;
};
template<PrintableContainer C>
void print_all(const C& container) {
for (const auto& item : container) {
std::cout << item << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<std::string> words = {"hello", "world"};
print_all(nums); // 1 2 3 4 5
print_all(words); // hello world
return 0;
}

Explanation

Requires clauses can contain compound requirements that check return types, nested requirements that reference other concepts, and type requirements. This enables powerful composition of constraints.

Key Points

  • 1Compound requirements check expression validity and return type
  • 2Nested requirements use 'requires' within requires
  • 3decltype extracts types for further checking
  • 4Build complex constraints from simple ones