#pragma once template struct range_t { T1 _min; // first value T2 _max; // second value }; template constexpr range_t, std::decay_t> make_range(T1&& _min, T2&& _max) { return{ std::forward(_min), std::forward(_max) }; } template constexpr bool operator <(const range_t& range, const T& value) { return range._min < value && range._max < value; } template constexpr bool operator <(const T& value, const range_t& range) { return value < range._min && value < range._max; } template constexpr bool operator ==(const range_t& range, const T& value) { return !(value < range._min) && !(range._max < value); } template constexpr bool operator ==(const T& value, const range_t& range) { return !(value < range._min) && !(range._max < value); }