Header file types/operators.hpp

namespace std
{
    template <typename T, T N>
    std::integral_constant<T, -N> operator-(std::integral_constant<T, N> const&);
    
    template <typename T, T N>
    std::integral_constant<T, ~N> operator~(std::integral_constant<T, N> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N+M> operator+(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N&M> operator&(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N|M> operator|(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N^M> operator^(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N-M> operator-(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N*M> operator*(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N/M> operator/(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
    
    template <typename T, T N, T M>
    std::integral_constant<T, N%M> operator%(std::integral_constant<T, N> const&, std::integral_constant<T, M> const&);
}