在现代c++中实现对象流容器的最佳实践

Best practice on implementing object stream container in modern c++

本文关键字:最佳 对象 c++ 实现      更新时间:2023-10-16

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

该库提供了一种从二进制字符串反向序列化对象的方法。所以它的API出现时只能从字符串的开始向前到结束,在那里已经处理的部分将不会被保留,就像流一样。

然而,它的工作方式与标准流不同,它不支持"<<"运算符返回char,for循环也不应返回char。它需要一个迭代器,它可以对它进行迭代器并返回它生成的对象。

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

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似乎是为char流操作设计的,有很多溢出等机制,而包装器不需要这些机制。

  2. 有人建议迭代器继承constiterator,以减少类似的代码。但它似乎还有很多应该不同的代码,主要集中在它的声明上。

在现代C++中,有没有关于这种容器或迭代器实现的最佳实践?

  1. 迭代器实际上不返回索引值。我认为它们是指向类型化对象的指针
    vector的情况下,迭代器满足RandomAccessIterator的要求(属性/特征/…),这就是为什么您可以通过下标运算符进行访问
    我建议您先阅读iterator的概念,您可能需要设计中的四个概念:InputIterator/OutputIteratorForwardIterator(我相信您可能会考虑这个迭代器)等。
    CCD_ 7通常总是指向容器的开头,而CCD_。在STL中,我不知道有什么例外。此外,容器的某些操作可能会使迭代器无效(我认为在您的用例中可能会发生这种情况)。在您的案例中,您首先需要清楚流设计的用例/需求

  2. 你可能是对的。扩展类和更改派生方法的语义等不是一个好主意。

  3. 这取决于你想用你的流做什么。只需在只读模式下迭代元素?或者你需要会写字吗?还是反过来?共有四种:iteratorconst_iteratorreverse_iteratorconst_reverse_iterator

最佳实践是STL,尽管很难消化。我推荐《C++编程语言》一书,在书中你可以了解想法、设计、用例等。