В настоящее время я пишу обертку для std::stringstream
, и я хочу переслать все вызовы operator<<
через мой класс в . Это отлично работает сейчас (спасибо за этот вопрос: wrapper class for STL stream: forward operator<< calls), но есть еще одна проблема с ним.Класс оболочки C++ для iostream, используйте модификаторы потока, такие как std :: endl с оператором <<
Скажем, у меня есть следующий код:
class StreamWrapper {
private:
std::stringstream buffer;
public:
template<typename T>
void write(T &t);
template<typename T>
friend StreamWrapper& operator<<(StreamWrapper& o, T const& t);
// other stuff ...
};
template<typename T>
StreamWrapper& operator<<(StreamWrapper& o, T const& t) {
o.write(t);
return o;
}
template<typename T>
void StreamWrapper::write(T& t) {
// other stuff ...
buffer << t;
// other stuff ...
}
Если теперь я это сделать:
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff";
Это работает просто отлично. Но если я хочу использовать модификаторы потока, такие как std::endl
, который является функцией в соответствии с http://www.cplusplus.com/reference/ios/endl, я просто не компилирую.
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff" << std::endl;
Почему? Как я могу переслать модификаторы потока тоже?
Что ошибка компиляции? –
Есть перегрузки 'operator <<', которые принимают функцию, а затем вызывают эту функцию в потоке: http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt http: //en.cppreference .com/w/cpp/io/manip – BoBTFish