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; }