Есть какой-нибудь ярлык для предоставления идентичных операторов потока ostream и wostream?

Я хочу предоставить ostream<< и Wostream<< операторы для класса, которые идентичны, за исключением того, что один является широко распространенным, а другой нет.

Есть ли какая-то хитрость, чтобы сделать это, что уродливо, чем просто копирование и внесение необходимых настроек?

Для справки, это необходимо, потому что мы используем wostream в качестве стандарта, но EXPECT_PRED3 Google-теста не проходит компиляцию, когда нет ostream<< предоставляется, хотя другие макросы успешно работают с ostream или же wostream,

Мой фактический код выглядит так:

class MyClass
{
...
public:
friend std::wostream& operator<<(std::wostream& s, const MyClass& o)
{
...
}
};

3

Решение

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;
}
5

Другие решения


По вопросам рекламы [email protected]