代码之家  ›  专栏  ›  技术社区  ›  Sqeaky

在C++中传递未知类到字符串流

  •  2
  • Sqeaky  · 技术社区  · 16 年前

    我正在使用模板函数,我正在传递,我可能正在将各种类的实例发送到字符串流。我能做些什么来确保这个继续工作?

    让我更具体一点,我应该在哪里为这个定义行为?是否有一些成员应该位于发送到字符串流的每个类上,我应该在某些情况下增强或扩展现有的字符串流(我正在考虑构建一个从sstream继承并重载<<运算符以处理所有可能的类的类)?

    我甚至很难找到关于这个的文档,所以即使链接到更多的资源也会有所帮助。

    2 回复  |  直到 16 年前
        1
  •  5
  •   GManNickG    16 年前

    在我看来,您好像想要创建流插入操作符。对于希望能够输出到流的类,请定义自由函数:

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

    所以如果我们有 SomeClassType z; ,我们做到了。 std::cout << z (或任何其他输出流,如 fstream stringstream ,编译器将查找并找到我们的函数,并调用它。也就是说, STD:CUT & LT;L. 变成 operator<<(std::cout, z) 在里面你输出你需要的。

        2
  •  4
  •   Peter Alexander    16 年前

    你只需要超载 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)
    }
    
    推荐文章