【问题标题】:can I custom a stream whose element is a struct我可以自定义一个元素是结构的流吗
【发布时间】:2019-03-06 11:11:47
【问题描述】:

我有一个结构类型,假设它看起来像这样:

struct Token {
  int type;
  char value[64];
};

我想把Token 的对象放到一个流中,像get()peek() 这样的函数都返回一个对象(或引用/指针)?

类似这样的: Token token = stream.get();Token* token = stream.get();

【问题讨论】:

  • 这是不可能的,但你可以重载operator>> 函数来读取Token 对象。
  • 不确定,但也许专门为您的类型提供 std::char_traits(或编写自定义替换)是您想要的?
  • @HolyBlackCat 这可能还不够,例如get 函数从底层缓冲区读取一个“字符”,这也需要专门化(甚至可能重新实现)。
  • @reavenisadesk 你能告诉我们你真正想解决什么问题吗?为什么需要从getpeek 函数中获取Token?您是否正在为解析器/编译器创建标记器?那么你最好分层进行:解析器从标记器中提取标记,标记器从流中提取字符,流从缓冲区中提取字符,缓冲区依次从文件(或字符串,在例如std::istringstream)。
  • 问题是你仍然需要从你正在解析的文件中读取单个字符。创建一个实现合适接口(使用getpeek 等)并让这个类使用流来读取字符的标记器类要简单得多。

标签: c++ stream


【解决方案1】:

这是创建自定义流对象的方法的方法,可以通过继承 std::stringbuf 来完成

class MyStreamBuf : public std::stringbuf {
//... override some functions from stringbuf (eg. sync) to change behavior
};

class MyInputStream : public std::istream {
  MyStreamBuf buf_;
public:
  MyInputStream : std::istream(&buf_){
  }

//... add more interface here, etc.

}

接着你应该能够完成你的要求。

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2021-05-14
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2016-10-28
    • 2012-10-18
    相关资源
    最近更新 更多