Установка флагов std :: io_base для пользовательского класса потока

У меня есть собственный класс под названием Stream

class Stream
public:
Stream& operator<<(int i) { stream_ << i; return *this;}
template <typename CustomClass>
Stream& operator<<(const CustomClass& c) { stream_ << c.toString() /* assume this template always have toString(); return *this; }
private:
std::stringstream stream_;
};

Это очень простой пример того, что у меня есть на самом деле. И я пытаюсь установить флаги std :: ios_base следующим образом:

Stream() << 1 << std::hex << 2;

использование оператора;

Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; }

из того, что я понимаю, потому что std :: hex возвращает std :: ios_base, поэтому он должен вызвать это и установить флаг потоков. Но это всегда называется шаблоном. Примечание: если я удалю этот шаблон, все будет работать так же хорошо, как и следовало ожидать, но есть ли способ иметь оба?

Пожалуйста, не стесняйтесь спрашивать, если вам нужно больше разъяснений

1

Решение

Манипуляторы IOStream не являются объектами типа std::ios_baseони являются функциями, которые принимают и возвращают std::ios_base Рекомендации. Поэтому, когда вы хотите выполнить потоковую вставку относительно этих объектов, вы должны функциональные указатели:

Stream& operator<<(std::ios_base& (*manip)(std::ios_base&))
//                 ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
{
manip(this->stream);
return *this;
}
0

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

Других решений пока нет …

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