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 { template void process(Member par); // a member template is constrained template // also, now via a variable constr. void another(Tp par) requires Constraint2; }; template template void Data::process(T2 par) {} template template void Data::another(T2 par) requires Constraint2 {} int main() { Data{}.process(Combi{}); }