🎯intermediate
Advanced Requires Clauses
Master complex requirements and nested constraints
Example Code
cpp
#include <concepts>#include <iostream>#include <vector>#include <string>// Compound requirementstemplate<typename T>concept Printable = requires(T t, std::ostream& os) { { os << t } -> std::same_as<std::ostream&>;};// Nested requirementstemplate<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