Aktualnie piszę wrapper dla std::stringstream
i chcę przesłać wszystkie wywołania operator<<
przez moją klasę do std::stringstream
. To działa dobrze teraz (dzięki temu pytaniu: wrapper class for STL stream: forward operator<< calls), ale nadal istnieje jeden problem z tym.Klasa opakowująca C++ dla iostream, użyj modyfikatorów strumienia takich jak std :: endl z operatorem <<
Powiedzmy mam następujący kod:
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 ...
}
Gdybym teraz to zrobić:
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff";
Działa to dobrze. Ale jeśli chcę użyć modyfikatorów strumienia, takich jak std::endl
, który jest funkcją według http://www.cplusplus.com/reference/ios/endl, po prostu się nie kompiluję.
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff" << std::endl;
Dlaczego? W jaki sposób mogę również przekazać dalej modyfikatory strumienia?
Co znajduje się błąd kompilacji? –
Występują przeciążenia 'operator <<', które pobierają funkcję, a następnie wywołują tę funkcję w strumieniu: http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt http: //en.cppreference .com/w/cpp/io/manip – BoBTFish