在现代c++中实现对象流容器的最佳实践
Best practice on implementing object stream container in modern c++
我想用现代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。
我想我不能从istream继承X?因为istream似乎是为char流操作设计的,有很多溢出等机制,而包装器不需要这些机制。
有人建议迭代器继承constiterator,以减少类似的代码。但它似乎还有很多应该不同的代码,主要集中在它的声明上。
在现代C++中,有没有关于这种容器或迭代器实现的最佳实践?
-
迭代器实际上不返回索引值。我认为它们是指向类型化对象的指针
在vector
的情况下,迭代器满足RandomAccessIterator
的要求(属性/特征/…),这就是为什么您可以通过下标运算符进行访问
我建议您先阅读iterator
的概念,您可能需要设计中的四个概念:InputIterator
/OutputIterator
、ForwardIterator
(我相信您可能会考虑这个迭代器)等。
CCD_ 7通常总是指向容器的开头,而CCD_。在STL中,我不知道有什么例外。此外,容器的某些操作可能会使迭代器无效(我认为在您的用例中可能会发生这种情况)。在您的案例中,您首先需要清楚流设计的用例/需求 -
你可能是对的。扩展类和更改派生方法的语义等不是一个好主意。
-
这取决于你想用你的流做什么。只需在只读模式下迭代元素?或者你需要会写字吗?还是反过来?共有四种:
iterator
、const_iterator
、reverse_iterator
和const_reverse_iterator
。
最佳实践是STL,尽管很难消化。我推荐《C++编程语言》一书,在书中你可以了解想法、设计、用例等。
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 保留计时器集合(对象与指针)的最佳方法
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 从类中的对象调用类中的函数的最佳方法
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 将对象附加到智能指针向量的最佳方法
- 将对象数组作为参数传递的最佳方法是什么
- 如何为对象提供不同的接口(最佳)
- 调用列表中子对象方法的最佳方法
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 找到多组对象的最佳匹配的算法
- C++拥有持久对象的最佳方式
- 动态创建新对象的最佳方法
- 用C++编写返回对象的函数的最佳方法是什么
- 两者之间的最佳方法是什么:实例化对象或使用指针
- 确定两个文件路径引用同一文件对象的最佳方法是什么