#include <cassert>
#include <iostream>
#include <type_traits>

template<class T> concept Integral = std::is_integral_v<T>;
template<class T> concept SignedIntegral = Integral<T> && std::is_signed_v<T>;
template<class T> constexpr int route(T) { return 0; }
template<Integral T> constexpr int route(T) { return 1; }
template<SignedIntegral T> constexpr int route(T) { return 2; }

int main() {
    static_assert(route(1.5) == 0);
    static_assert(route(1u) == 1);
    static_assert(route(1) == 2);
    assert(route(-2) == 2);
    std::cout << "constraints ok\n";
}
