Способы решения error c2754 - "Частичная специализация не может иметь зависимый параметр шаблона, не являющийся типом"

Проблема в том, что для вычисления gcd нужно передать тип числа(Ty), числа A(Ax) и Б(Bx) этого типа. Просто написать отдельные реализации для разных типов не выход, потому что есть более сложные алгоритмы с такой же проблемой. Там типов может быть не 2-3, а 10+, например при вычислении матриц и т.д.

Никаких вариантов, как решить эту проблему - в голову не приходит. Есть идеи?

// КЛАСС IntegralConstant 
template <class Ty, Ty Value>
struct IntegralConstant {
    static constexpr Ty value = Value;

    using value_type = Ty;
    using type       = IntegralConstant;

    constexpr explicit operator value_type() const noexcept {
        return value;
    }

    [[nodiscard]] constexpr value_type operator()() const noexcept {
        return value;
    }
};

// КЛАСС NumberInCompileTime
template <class Ty, Ty Number>
struct NumberInCompileTime : IntegralConstant<Ty, Number> {
};

// НОД - Наименьший Общий Делитель
template <class Ty, Ty Ax, Ty Bx>
struct gcdX : gcdX<Ty, Bx, Ax % Bx>::type {
}; // вычисляет НОД Ax и Bx

template <class Ty, Ty Ax>
struct gcdX<Ty, Ax, 0> : NumberInCompileTime<Ty, Ax> {
}; // вычисляет НОД Ax и 0

template <class Ty, Ty Ax, Ty Bx>
struct gcd : gcdX<Ty, abs<Ty, Ax>::value, abs<Ty, Bx>::value>::type {
}; // вычисляет НОД (Ax) и (Bx)

template <class Ty>
struct gcd<Ty, 0, 0> : NumberInCompileTime<Ty, 1> {
};

Ответы (0 шт):