У меня есть собственный класс под названием 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, поэтому он должен вызвать это и установить флаг потоков. Но это всегда называется шаблоном. Примечание: если я удалю этот шаблон, все будет работать так же хорошо, как и следовало ожидать, но есть ли способ иметь оба?
Пожалуйста, не стесняйтесь спрашивать, если вам нужно больше разъяснений
Манипуляторы IOStream не являются объектами типа std::ios_base
они являются функциями, которые принимают и возвращают std::ios_base
Рекомендации. Поэтому, когда вы хотите выполнить потоковую вставку относительно этих объектов, вы должны функциональные указатели:
Stream& operator<<(std::ios_base& (*manip)(std::ios_base&))
// ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
{
manip(this->stream);
return *this;
}
Других решений пока нет …