Установка флагов 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, поэтому он должен вызывать это и устанавливать флаг потоков. Но он всегда вызывает шаблон. Примечание. Если я удалю этот шаблон, все будет работать так же хорошо, как и следовало ожидать, но есть ли способ получить и то, и другое?

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


person abumusamq    schedule 15.04.2013    source источник
comment
Просто чтобы уточнить, что я пытаюсь сделать, это сделать перегруженный оператор ios_base !важным по сравнению с шаблоном. Я считаю, что это очень странное поведение, поскольку шаблоны должны быть помещены в самое последнее место, если никакой другой тип не может быть разрешен во время компиляции, его следует использовать. и я считаю, что библиотека std связана раньше всех других библиотек.   -  person abumusamq    schedule 16.04.2013
comment
кстати, даже если я верну std::ios_base& и верну поток, это не сделает работу, я имею в виду, что он все еще вызывает шаблон поверх типизированной перегрузки   -  person abumusamq    schedule 16.04.2013


Ответы (1)


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

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