在C ++中将未知类传递给String Streams

时间:2010-03-16 23:27:14

标签: c++ stream sstream

我正在使用模板函数,我正在传递,我可能会将各种类的实例发送到字符串流。我该怎么做才能确保它继续有效?

让我更具体一点,我在哪里定义行为?是否有一些成员应该在每个类上发送到字符串流,如果我在一些增强或扩展现有的String流(我正在考虑构建一个继承自sstream的类并重载<<运算符来处理所有可能的课程)?

我甚至无法找到相关文档,因此即使链接到更多资源也会有所帮助。

2 个答案:

答案 0 :(得分:5)

听起来我想要制作流插入操作符。对于您希望能够输出到流的类,请定义自由函数:

std::ostream& operator<<(std::ostream& stream, const SomeClassType& x)
{
    stream << x.someData();

    return stream;
}

因此,如果我们有SomeClassType z;,我们做std::cout << z(或任何其他输出流,如fstreamstringstream),编译器将查找并查找我们的功能,并称之为。也就是说,std::cout << z变为operator<<(std::cout, z),并在那里输出您需要的内容。

答案 1 :(得分:4)

您只需要为这些类重载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)
}