【发布时间】: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。
我想我不能从 istream 继承 X?因为 istream 似乎是为字符流操作而设计的,具有许多机制如溢出等,而包装器不需要这些机制。
iterator 继承自 const_iterator 有人建议减少类似代码。不过好像还是有很多代码应该不一样,主要还是看它的声明吧。
在现代 C++ 中这种容器或迭代器的实现是否有任何最佳实践?
【问题讨论】:
-
不确定我是否做对了。您需要一个混合解决方案。流的迭代器(意思是并且通常设计用于迭代可数容器元素)?我的第一个想法是您需要设计您的 stream 以便它具有迭代器属性和特征。我们从
io知道的流没有那个。 -
@Elyasin 当然,我应该为流的开始和结束函数返回什么?
-
我会尽量给出一个答案,希望能进一步帮助你,但我仍然不太清楚你对流的要求。
-
@101010,它是相关的,但两个问题之间存在本质区别,使得该答案不适合我的情况。他们所做的是解码streambuf中的二进制数组,但我只是在包装。