template concept Subtractable = requires(Type lh, Type rh) { lh - rh; }; //functions template // advice: define concepts in concept Addable = // separate headers. requires(Type lh, Type rh) { lh + rh; }; template // declares an unconstrained void fun(); // function template template // declares a constrained overloaded void fun(); // function template template // same, requirement follows fun void fun() requires Addable; template // same, requirement precedes fun requires Addable void fun(); //= //classes template // unconstrained struct Data; // declaration template // constrained declaration struct Data; // (i.e., a specialization) // template // same specialization // requires Addable struct Data; //= //multi template // used concepts concept C1 = true; template concept C2 = true; template // multiply constrained requires C2 void fun(); // function template template // same, using 'and' requires C1 and C2 void fun(); template // same, trailing 'requires' void fun() requires C1 and C2; template struct Multi; template // multiply constrained requires C2 struct Multi; // class template //=