【问题标题】:C++: Is it possible to get a std::string out of an object that overloads the << operator?C ++:是否可以从重载 << 运算符的对象中获取 std::string ?
【发布时间】:2011-07-11 20:13:47
【问题描述】:

我有一个可以用std::cout &lt;&lt; obj 打印到控制台的对象,但我无法从中得到std::string,因为它似乎没有实现类似.string() 的方法。我想我也许可以使用那个重载的运算符来获取所有内容的字符串表示,而不是每次需要时都必须自己实现一个函数来完成它,尽管在这个主题上一无所获让我认为这是不可能的.

【问题讨论】:

    标签: c++ string stl


    【解决方案1】:

    使用std::ostringstream。它是一个写入字符串的 C++ 流实现。

    【讨论】:

    • 我不知道这是不好的做法。那我稍后再做
    • @Greg “NOW-helper”对now很有用。是的,他们应该得到一个赞成票(或 10 个)作为奖励。但是,将答案标记为立即 会降低人们突然出现并给出(谁知道)更好的想法或解决问题的新方法的可能性。最后,您应该接受一个对其他人最有帮助的答案。请参阅 Meta.SO 上的FGITW
    【解决方案2】:

    您可以使用std::ostringstream

    std::ostringstream os;
    os << obj;
    std::string result = os.str();
    

    【讨论】:

      【解决方案3】:

      有不同的实现方式,您可以根据std::ostringstream 手动实现它,也可以在boost::lexical_cast 中使用它的预打包版本。对于更复杂的操作,您可以实现一个就地字符串构建器,就像我作为答案 here 提供的那样(这解决了构建通用字符串的更复杂问题,但如果您想检查它是一个简单的通用解决方案) .


      似乎链接的问题已从 StackOverflow 中删除,所以我将提供基本骨架。第一个想法是考虑我们要使用就地字符串构建器来使用什么,这基本上是避免使用创建不必要的对象:

      void f( std::string const & x );
      f( make_string() << "Hello " << name << ", your are " << age << " years old." );
      

      为此,make_string() 必须提供一个能够利用现有 operator&lt;&lt; 用于不同类型的对象。并且整个表达式必须可以转换为std::string。基本实现相当简单:

      class make_string {
         std::ostringstream buffer;
      public:
         template <typename T>
         make_string& operator<<( T const & obj ) {
            buffer << obj;
            return *this;
         }
         operator std::string() const {
            return buffer.str();
         }
      };
      

      这可以用最少的代码完成大部分的实现。它有一些缺点,例如它不采用 manipulators (make_string() &lt;&lt; std::hex &lt;&lt; 30),因为您必须提供额外的重载来采用操纵器(函数指针)。这个实现还有其他一些小问题,大部分都可以通过添加额外的重载来解决,但是上面的基本实现对于大多数常规情况来说已经足够了。

      【讨论】:

      • 您提到的链接不再有效。你还记得你的答案是什么吗?
      • @rve:我在这个答案中提供了基本的实现。它可以改进(我提供的功能比这个版本更多,但这是一个好的开始。
      猜你喜欢
      • 2012-01-23
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多