template concept bool C3 = true; template concept bool ID() { return true; } template concept bool IncAndDec() { return requires(Type par) { ++par; // `Type' variables/objects must --par; // support pre- and postfix par++; // increment and decrement par--; // operators }; } template concept bool ReturnTypes() { return requires(Type par) { { ++par } -> Type &; // prefix inc. returns a Type & { par[0] } -> char; // the index operator returns a char }; } template concept bool MultiArgs() { return requires(Type lhs, Type rhs) { { lhs + rhs } -> Type; { lhs += rhs } -> Type &; { lhs.c_str() } -> char const *; }; } template concept bool CombiOps() { return requires(Type lhs, Type rhs) { { lhs + rhs } -> Type; { lhs += rhs } -> Type &; } and requires(Type lhs) { { lhs.c_str() } -> char const *; }; } template concept bool ValueType() { return requires() { typename Type::value_type; }; } template class Data { }; struct EnumStruct { enum value_type { VALUE }; }; template concept bool InputIterator() { return true; } template concept bool OutputIterator() { return true; } template concept bool ForwardIterator() { return requires { requires InputIterator(); requires OutputIterator(); }; } template concept bool BidirectionalIterator() { return requires { requires ForwardIterator(); requires IncAndDec(); }; } template concept bool RandomAccessIterator() { return requires { requires BidirectionalIterator(); } and requires(Type lhs, Type rhs) { { lhs + rhs }; { lhs - rhs }; }; } template struct Iterator { void fun(); }; template void rSort(RAI begin, RAI end) {} int main() { // Data data; Iterator iter; iter = iter; rSort(10, 20); iter.fun(); }