Build Your Own Concepts
Specify the concept name, give it a name and give it a requires clause. Specify the syntax you want for your concept to satisfy.
#include <type_traits>
template <typename T>
concept MyIntegralT = std::is_integral_v<T>;
template <typename T>
concept Multipliable = requires(T a, T b) { a * b; };
// will only make sure the syntax is valid, but won't check the result value
template <typename T>
concept Incrementable = requires(T a) {
a += 1;
a++;
++a;
};
// Usage:
template <typename T>
requires MyIntegralT<T>
T add(T a, T b) {
return a + b;
}
template <MyIntegralT T> T add_2(T a, T b) { return a + b; }
auto add_3(MyIntegralT auto a, MyIntegralT auto b) { return a + b; }