У меня есть ситуация, когда мой оператор модуля шаблона отлично работает между типами float и integer-i sh. Насколько я помню, есть способ сделать так, чтобы он выбирал более конкретный c, а не более широкий, но я не могу найти или вспомнить, как это сделать.
В основном у меня есть 2 метода, которые сталкиваются (ошибка переопределения).
Я пытаюсь получить специализированную перегрузку оператора модуля, которая будет использоваться, когда его тип (T_COORDS) - float , более широкий, когда он не плавает.
Специализированный (обратите внимание, он использует математическую функцию fmod):
template <size_t N
, enable_if_t<N != 0 && N <= C_COORDS*N_COORDS && N % C_COORDS == 0, bool> = false>
friend Coords operator % (const Coords<float,C_COORDS,N_COORDS>& coords0, const auto (& coords1)[N])
{
Coords<float,C_COORDS,N_COORDS> result = coords0;
for (int i=0; i < C_COORDS*N_COORDS; i++)
result.coords[i] = fmod(result.coords[i], coords1[i%N]);
return result;
}
Более широкий (обратите внимание, что он использует стандартный модуль упругости):
template <std::size_t N
, std::enable_if_t<N != 0 && N <= C_COORDS*N_COORDS && N % C_COORDS == 0
, bool> = false>
friend Coords operator % (const Coords<T_COORDS,C_COORDS,N_COORDS>& coords0, const auto (& coords1)[N])
{
Coords<T_COORDS,C_COORDS,N_COORDS> result = coords0;
for (int i=0; i < C_COORDS*N_COORDS; i++)
result.coords[i] %= coords1[i%N];
return result;
}
Эти перегрузки включены в определение класса Template:
template <class T_COORDS, size_t C_COORDS, size_t N_COORDS>
class Coords {
public:
T_COORDS coords[C_COORDS*N_COORDS];
// (body in here)
};