【问题标题】:Best practice on implementing object stream container in modern c++在现代 C++ 中实现对象流容器的最佳实践
【发布时间】:2016-03-22 04:15:07
【问题描述】:

我想用现代 C++ 方式包装一些 c 库。

该库提供了一种从二进制字符串反向序列化对象的方法。 使得它的API出现只能从字符串的开头转发到结尾,已经处理的部分不会被保留,就像流一样。

但它的工作方式与标准流不同,它不支持“

首先,我想实现如下代码:

class Obj{
  c_ptr ptr;
  .....
}

class X{
   public:
   class const_iterator : std::iterator<std::forward_iterator_tag, Obj>{
       ......
   };

   class iterator : const_iterator{
       .....
   };

   X::const_iterator cbegin();
   X::iterator begin();
   X::const_iterator cend();
   X::iterator end();
   ........
}

或将 Obj 类合并到迭代器中。 在这种情况下存在问题。

1. 如矢量迭代器示例所示,begin 和 end() 应该返回索引值。但是这里 X 是流,我只能得到一次开始,之后访问流不会是第一个字节。在 iostream 中,end() 似乎返回一个特定的字符 EOF。

  1. 我想我不能从 istream 继承 X?因为 istream 似乎是为字符流操作而设计的,具有许多机制如溢出等,而包装器不需要这些机制。

  2. iterator 继承自 const_iterator 有人建议减少类似代码。不过好像还是有很多代码应该不一样,主要还是看它的声明吧。

在现代 C++ 中这种容器或迭代器的实现是否有任何最佳实践?

【问题讨论】:

  • 不确定我是否做对了。您需要一个混合解决方案。流的迭代器(意思是并且通常设计用于迭代可数容器元素)?我的第一个想法是您需要设计您的 stream 以便它具有迭代器属性和特征。我们从io 知道的流没有那个。
  • @Elyasin 当然,我应该为流的开始和结束函数返回什么?
  • 我会尽量给出一个答案,希望能进一步帮助你,但我仍然不太清楚你对流的要求。
  • @101010,它是相关的,但两个问题之间存在本质区别,使得该答案不适合我的情况。他们所做的是解码streambuf中的二进制数组,但我只是在包装。

标签: c++ c++11


【解决方案1】:
  1. 迭代器实际上不返回索引值。我认为它们是指向类型化对象的指针。
    vector 的情况下,迭代器满足RandomAccessIterator 的要求(属性/特征/...),这就是您可以通过下标 运算符访问的原因。
    我建议你先阅读iterator 概念,你可能需要一些你设计的概念:InputIterator/OutputIteratorForwardIterator(我相信这个迭代器是你可能会考虑的)等等。begin() 通常总是指向容器的开头,end() 通常总是指向容器的结尾。在 STL 中,我不知道有什么例外。也可能是容器的某些操作会使迭代器无效(我相信这很可能在您的用例中)。在您的情况下,您首先需要明确您的流设计的用例/要求。

  2. 你可能是对的。而且扩展一个类,改变派生方法的语义等等,也不是什么好主意。

  3. 这取决于您想对流执行什么操作。只需在只读模式下迭代元素?还是你需要会写?还是反过来?有四种:iteratorconst_iteratorreverse_iteratorconst_reverse_iterator

最佳实践是 STL,尽管很难消化。我推荐《The C++ Programming Language》一书,您可以在其中了解想法、设计、用例等。

【讨论】:

  • 是的,前向迭代器是我最喜欢的。我怎样才能防止某些使用破坏流之类的功能。就像在不同位置的同一个容器上的两个迭代器。
  • 流只是输入,只能在类似循环的情况下使用。这也意味着它不能是反向迭代器。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2016-05-28
相关资源
最近更新 更多