У меня есть несколько enums
, определенных следующим образом:
enum class Suit {
spades = 1, hearts, diamonds, clubs,
first = spades, last = clubs
};
enum class Rank {
six = 6, seven, eight, nine, ten, jack, queen, king, ace,
first = six, last = ace
};
Для каждого из этих enums
я перегружен некоторыми операторами:
Suit operator++(Suit& r) { return r = (Suit)(static_cast<std::underlying_type_t<Suit>>(r) + 1); }
Rank operator++(Rank& r) { return r = (Rank)(static_cast<std::underlying_type_t<Rank>>(r) + 1); }
// more overloads ...
Обратите внимание, что реализацияПерегрузки операторов одинаковы для обоих типов. Как мне избежать этого дублирования кода?
Я мог бы использовать шаблоны ...
template<class T>
T operator++(T& r) { return r = (T)(static_cast<std::underlying_type_t<T>>(r) + 1); }
, но эти перегрузки должны применяться только к моим пользовательским типам.