2

我需要实现一个 C++ iostream 操纵器。在这里和那里阅读似乎人们使用两种方式

  1. 使用ios_base::xallocios_base::iword

  2. 从 iostream 实现派生类,如下例所示。

我喜欢第二种方式,但与第一种方式相比,它可能有我看不到或无法理解的缺点。

    // Example of point 2
    struct mystream : public iostream
    {  
      ostream& o_;
      mystream(ostream& o) : o_(o) {} 

      ostream& operator << (int a) {
        // do something with o and a
        o << "<A>" << a << "</A>";
        return *this;
      }     
     };

     ostream mymanipulator(ostream& out) { 
       return mystream(out);
     }

我在C++ iostream 的自定义操纵器这篇文章中找到了方法 #2 的一个非常好的实现。

在我看来,它xalloc and iword更习惯于为我的自定义流存储一些自定义内部状态,以便在某个时候使用。

4

1 回答 1

2

我不会推荐其中任何一种。

使用ios_base::xallocios_base::iword

iword()您还没有确切地告诉我们您将如何使用存储在流中的数据,但是每次要写入时都进行设置有点不直观。

iostream从...实现派生类

通常你不想从流基类继承。它可能有用的唯一情况是当您将自定义流包装在流缓冲区周围时,但这通常是为了方便。

另一个问题是您的插入器返回std::ostream,这意味着在链接运算符时,您只会std::ostream在第二次写入时写入基础对象:

mystream str;
str << 100  // writes "<A>100</A>"
    << 200; // only writes 200

惯用的解决方案是std::num_put<char>为您的流的语言环境自定义一个方面。这样,您可以将功能直接包装在流的底层,这样它就不会改变用户使用流的方式。

于 2014-05-29T14:12:34.053 回答