template concept bool Addable = requires(Type lh, Type rh) { lh + rh; }; template concept bool Constraint() // function concept { return requires(Type lhs, Type rhs) { { lhs < rhs } -> bool; // multiple lhs + rhs; // constraints // typename Type::value_type; }; } template concept bool Constraint2 = // variable concept requires(Type lhs, Type rhs) { // { operator<(lhs, rhs) } -> bool; // both OK { lhs < rhs } -> bool; lhs + rhs; typename Type::value_type; }; // template concept bool Constraint = true ; struct Combi { using value_type = int; }; bool operator<(Combi const &lhs, Combi const &rhs); Combi operator+(Combi const &lhs, Combi const &rhs); template struct Data { // constraint applies only to a member void process() requires Addable; template void add(Tp tp); }; template // formal type names may differ void Data::process() requires Addable // from the class. {} template // formal type names may differ template void Data::add(Tp tp) {} int main() { Data{}.process(); }