#pragma once template concept impl_basic_op = requires(T a, T2 b) { +a; -a; -b; +b; a + b; a - b; a* b; a / b; b + a; b - a; b* a; b / a; }; template concept impl_modulo = requires(T a, T2 b) { a % b; b % a; }; template concept impl_bitwise_op = requires(T a, T2 b) { ~a; ~b; a & b; a | b; a ^ b; a << b; a >> b; b & a; b | a; b ^ a; b << a; b >> a; }; template concept impl_arith_op = impl_basic_op && impl_modulo && impl_bitwise_op;