Using custom seekable source boost::iostreams::stream
如果我想使用带有boost :: iostreams :: stream的自定义可搜索源,需要实现哪些方法?我在Boost的教程中查找了无法查找的源缓冲区,并尝试将标签修改为input_seekable并添加本教程中的seek函数。不幸的是,这导致我的编译器抱怨缺少我找不到其文档的get函数(从编译器错误消息中,我可以确定签名是什么,仅此而已)。此功能应该做什么?我还需要实现其他功能吗?
此外,编译器希望我为seek提供三个输入参数。第一个是*dev,我认为应该由stream本身提供。
设备头:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class SourceBuffer
{
private:
FILE *file;
public:
typedef char char_type;
typedef boost::iostreams::input_seekable category;
SourceBuffer(const char *fileName);
SourceBuffer();
~SourceBuffer();
std::streamsize read(char *s, std::streamsize n);
boost::iostreams::stream_offset seek(boost::iostreams::stream_offset off, std::ios_base::seekdir way);
void open(const char *fileName);
void close();
protected:
} |
用法:
1 2
| boost::iostreams::stream<SourceBuffer> *example;
example = new boost::iostreams::stream<SourceBuffer>(fileName); |
确切的要求记录在SeekableDevice概念下:http://www.boost.org/doc/libs/1_58_0/libs/iostreams/doc/concepts/seekable_device.html
您可以查看列出的任何模型的实现,以获取有关如何执行此操作的提示:
-
数组
-
文件,
-
file_descriptor,
-
映射文件
关于dev*参数,您似乎将Device::seek(为了满足该概念而实现的东西)与免费功能模板boost :: iostreams :: seek
混淆了
- 不幸的是,这三个功能对我来说还不够(我已经看到了您链接的站点)。另外,编译器暗示它需要一个具有三个输入的函数,而唯一的候选者是在我的SourceBuffer中定义的具有两个输入的函数(我根本不使用seek函数)。我的一位同事最近建议,我们没有完全实现boost,这很可能是罪魁祸首。
-
也许您应该只分享一个SSCCE,我们可以与之一起使用来澄清问题
-
我发布的是SSCCE。只需将我在上面的用法块中提供的内容放入main函数(并根据需要添加delete example;),就会得到上述编译器错误。函数的确切实现应该无关紧要;假设他们现在是空的。
-
这是在ideone上。我提到的两个编译器错误恰好在最后。
-
如此...您将非标签类型用作类别(而不是已记录的类型),并且未实现所有必需的功能。 coliru.stacked-crooked.com/a/8f547aa0536d1477我现在了解了,您正在寻找仅输入面。没有这样的概念(在实践中似乎是合理的)。不要执行它,也不要明确指定流类型。
-
...在该头文件中有一个名为input_seekable的标记。是否应该在内部使用该标签?此页面底部的图片似乎表明它已经存在。无论如何,我现在就将其拿来运行。
-
input_seekable在我看来并不像标签。
-
因此,解决方案是使用SeekableDevice概念而不实现write方法?