Способы решения 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> {
};