У меня есть обобщенная структура по модулю, которая называется quotient_ring
. Соответствующие биты показаны ниже.
template <typename R = long long>
struct quotient_ring{
using Q = quotient_ring;
R x, m;
...
template <typename T>
friend constexpr std::basic_ostream<T> &operator<< (std::basic_ostream<T> &str, const Q &q){
return str << '(' << q.x << ")%(" << q.m << ')';
}
};
Этот оператор <<
будет печатать что-то вроде 2
mod 7
как (2)%(7)
. Причина, по которой мне нужны скобки, заключается в том, что тип R
может стать очень вложенным. Однако, если R
является только арифметическим типом, таким как long long
, я хотел бы печатать без скобок. Я обнаружил, что один из способов сделать это заключается в следующем.
template <typename T>
friend constexpr std::basic_ostream<T> &operator<< (std::basic_ostream<T> &str, const Q &q){
if constexpr (std::is_arithmetic<R>::value) return str << q.x << '%' << q.m;
else return str << '(' << q.x << ")%(" << q.m << ')';
}
Я думаю, что это хорошее решение. Тем не менее, я хотел бы знать, можно ли добиться этого с помощью специализации на шаблонах. Лично мне больше нравится специализация шаблонов, чем переход по признакам типа.