Я хочу предоставить ostream<< и Wostream<< операторы для класса, которые идентичны, за исключением того, что один является широко распространенным, а другой нет.
Есть ли какая-то хитрость, чтобы сделать это, что уродливо, чем просто копирование и внесение необходимых настроек?
Для справки, это необходимо, потому что мы используем wostream в качестве стандарта, но EXPECT_PRED3 Google-теста не проходит компиляцию, когда нет ostream<<
предоставляется, хотя другие макросы успешно работают с ostream
или же wostream
,
Мой фактический код выглядит так:
class MyClass
{
...
public:
friend std::wostream& operator<<(std::wostream& s, const MyClass& o)
{
...
}
};
std::ostream
а также std::wostream
это просто специализации шаблонного класса std::basic_ostream
. Написание шаблонного operator <<
решу вашу проблему. Вот пример:
struct X { int i; };
template <typename Char, typename Traits>
std::basic_ostream<Char, Traits> & operator << (std::basic_ostream<Char, Traits> & out, X const & x)
{
return out << "This is X: " << x.i << std::endl;
}
Как указано в комментариях, вы можете пойти еще дальше и параметризовать свой operator <<
любым классом, который предоставляет некоторый потокоподобный интерфейс:
template <typename OStream>
OStream & operator << (OStream & out, X const & x)
{
return out << "This is X: " << x.i << std::endl;
}