我正在使用模板函数,并且正在传递,我可能正在将各种类的实例发送到字符串流。我能做些什么来确保这继续有效?
让我更具体一点,我在哪里定义这个行为?是否有一些成员应该在每个发送到字符串流的类上,我是否应该增强或扩展现有的字符串流(我正在考虑构建一个从 sstream 继承并重载 << 运算符以处理所有可能的类类)?
我什至找不到有关此的文档,因此即使是指向更多资源的链接也会有所帮助。
在我看来,您想制作流插入运算符。对于您希望能够输出到流的类,请定义自由函数:
std::ostream& operator<<(std::ostream& stream, const SomeClassType& x)
{
stream << x.someData();
return stream;
}
因此,如果我们有SomeClassType z;
,并且我们有std::cout << z
(或任何其他输出流,如fstream
or stringstream
),编译器将查找并找到我们的函数,并调用它。也就是说,在里面你输出你需要的东西std::cout << z
。operator<<(std::cout, z)
您只需要operator<<
为这些类重载,例如
struct Point { int x, y; };
std::ostream& operator<<(std::ostream& os, const Point& p)
{
return os << '(' << p.x << ", " << p.y << ')';
}
然后你可以在你的函数中使用它,这可能是这样的:
template <class T>
std::string to_string(const T& x)
{
std::stringstream ss;
ss << x;
return ss.str();
}
int main()
{
Point p = {1, 2};
std::string ps = to_string(p);
std::cout << ps << std::endl; // (1, 2)
}