gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:34:18 24 4
gpt4 key购买 nike

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

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

但它与标准流的工作方式不同,它不支持“<<”运算符返回 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. 如 vector 迭代器示例所示,begin 和 end() 应返回索引值。但是这里的X是流,我只能得到一次开始,之后访问流就不是第一个字节了。在 iostream 中,end() 似乎返回一个特定的字符 EOF。

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

  2. 有人建议从 const_iterator 继承 iterator 以减少类似代码。但是好像还是有很多代码应该不同,主要集中在它的声明上。

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

最佳答案

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

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

  3. 这取决于您要对流执行的操作。简单地以只读模式遍历元素?或者你需要能够写作吗?还是反过来?有四种:iteratorconst_iteratorreverse_iteratorconst_reverse_iterator

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

关于c++ - 在现代 C++ 中实现对象流容器的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com