Очевидный подход приведет к тому, что ваша перегрузка будет учтена для всех типов; это приведет к неоднозначности вызовов для всех типов, поскольку шаблоны не являются разборчивыми. Таким образом, вам нужен какой-то способ сообщить компилятору, что ваш enum
является правильным типом enum
, и игнорировать все остальное; класс черт, вероятно, самый простой способ сделать это.
namespace NS {
enum EnumA { };
template<typename T>
struct is_ns_enum : std::false_type { };
template<>
struct is_ns_enum<EnumA> : std::true_type { };
}
Оттуда вы можете использовать SFINAE для реализации своей функции.
template<typename T>
inline typename std::enable_if<is_ns_enum<T>::value, std::ostream&>::type
operator <<(std::ostream& s, const T&) {
...
}
Таким образом, перегрузка рассматривается для любых типов, для которых вы специализируете is_ns_enum
, но отбрасывается для всех других типов, предотвращая множество неоднозначных ошибок перегрузки.