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 { void process(); }; // template // Constraint may or may not be specified template // as the constraints are implied by Data void Data::process() // the formal typename may also be different {} template struct Data2 { void process(); }; template // Constraint must be specified, void Data2::process() // but the formal type name { // doesn't have to be Type int x = 0; int y = x; x = y << 1; } template struct Data3 { void process(); }; template // Constraint must be specified, void Data3::process() // but the formal type name { // doesn't have to be Type int x = 0; int y = x; x = y << 1; } int main() { Data{}.process(); Data2{}.process(); }