自定义 ostream 仅打印 `<<` 链的最后一个字符串
Custom ostream prints only last string of `<<` chain
我正在尝试使用自定义流运算符实现 class,并继承它以便拥有一个基础 class 和一个具有不同流的派生对象。然后我重载 <<
运算符以使用存储的 ostream
.
这是代码的工作示例:
#include <string>
#include <memory>
#include <ostream>
#include <iostream>#
#include <fstream>
class Sink {
public:
Sink() {
m_stream = std::unique_ptr<std::ostream>(new std::ostream(std::cout.rdbuf()));
};
template<typename T>
std::ostream& operator<<(const T& obj) {
return *m_stream;
}
protected:
std::unique_ptr<std::ostream> m_stream;
};
class FileSink : public Sink {
public:
FileSink() {
m_stream = std::unique_ptr<std::ostream>(new std::ofstream("file.txt"));
}
};
int main() {
Sink s;
FileSink fs;
s << "First console string " << "second console string";
fs << "First file string " << "second file string";
return 0;
}
我在控制台上写 Sink class
,在文件上写 FileSink
。
问题是使用这段代码我只打印每条指令的最后一个字符串。
在控制台中我看到以下输出:
second console string
在文件中我可以看到这个输出:
second file string
我做错了什么以及如何打印预期的输出?
template<typename T>
std::ostream& operator<<(const T& obj) {
*m_stream << obj; // you missed this
return *m_stream;
}
此外,您可以将 operator<< 定义为非成员函数。
template <typename T>
Sink& operator<<(Sink &sink, const T &obj) {
*(sink.m_stream) << obj;
return sink;
}
并让它成为 Sink 的朋友:
class Sink {
template <typename T>
friend Sink& operator<<(Sink &sink, const T &obj);
// other code.
}
您的 operator<<
什么都不做,returns std::ostream&
。然后你将 std::ostream::operator<<
应用于那个 std::ostream&
。意料之中!
做你想做的标准方法:
template<typename T>
Sink & Sink::operator<<(const T& obj) {
*m_stream << obj;
return *this;
}
template<typename T>
FileSink & FileSink::operator<<(const T& obj) {
*m_stream << obj;
return *this;
}
要防止代码重复,您可以使用继承。我认为它可能会重复 std::stream
继承方案。 :)
我正在尝试使用自定义流运算符实现 class,并继承它以便拥有一个基础 class 和一个具有不同流的派生对象。然后我重载 <<
运算符以使用存储的 ostream
.
这是代码的工作示例:
#include <string>
#include <memory>
#include <ostream>
#include <iostream>#
#include <fstream>
class Sink {
public:
Sink() {
m_stream = std::unique_ptr<std::ostream>(new std::ostream(std::cout.rdbuf()));
};
template<typename T>
std::ostream& operator<<(const T& obj) {
return *m_stream;
}
protected:
std::unique_ptr<std::ostream> m_stream;
};
class FileSink : public Sink {
public:
FileSink() {
m_stream = std::unique_ptr<std::ostream>(new std::ofstream("file.txt"));
}
};
int main() {
Sink s;
FileSink fs;
s << "First console string " << "second console string";
fs << "First file string " << "second file string";
return 0;
}
我在控制台上写 Sink class
,在文件上写 FileSink
。
问题是使用这段代码我只打印每条指令的最后一个字符串。
在控制台中我看到以下输出:
second console string
在文件中我可以看到这个输出:
second file string
我做错了什么以及如何打印预期的输出?
template<typename T>
std::ostream& operator<<(const T& obj) {
*m_stream << obj; // you missed this
return *m_stream;
}
此外,您可以将 operator<< 定义为非成员函数。
template <typename T>
Sink& operator<<(Sink &sink, const T &obj) {
*(sink.m_stream) << obj;
return sink;
}
并让它成为 Sink 的朋友:
class Sink {
template <typename T>
friend Sink& operator<<(Sink &sink, const T &obj);
// other code.
}
您的 operator<<
什么都不做,returns std::ostream&
。然后你将 std::ostream::operator<<
应用于那个 std::ostream&
。意料之中!
做你想做的标准方法:
template<typename T>
Sink & Sink::operator<<(const T& obj) {
*m_stream << obj;
return *this;
}
template<typename T>
FileSink & FileSink::operator<<(const T& obj) {
*m_stream << obj;
return *this;
}
要防止代码重复,您可以使用继承。我认为它可能会重复 std::stream
继承方案。 :)