在与Haskell和函数式语言进行了大量合作之后,我正在学习C++,我发现我一直在努力解决同一问题:

  • 从输入流
  • 读取一些数据
  • 基于特定算法
  • 对它们进行标记
  • 处理 token

  • 如果这是Haskell,我可以简单地利用一切都是惰性的事实,并按照自己的想法编写转换,然后在下游被消耗时将其应用。甚至还有执行此精确模式的库(conduitpipes)。

    假设我想采用1 2 3 4 5 6 ...序列并输出12 34 56 ...。我可以看到如何编写临时代码,该代码在流上运行并就地处理数据。但是我想知道是否存在一种抽象机制,该机制允许我通过以任何可想到的方式转换另一流中的数据来构建新流。 这个抽象应该允许我在处理数据时缓冲数据,而不仅仅是将单个元素简单映射到新值。

    限制如下:
  • 除了stdlib,我不能使用任何其他库。
  • 它必须在C++ 03上工作(意味着没有C++ 11功能。)

  • 如果您正在考虑,这是家庭作业吗?很好,我得到了很多类分配,这些分配要求我使用数据流(这是没有库和C++ 03限制的原因)。不是我不知道如何使用while循环来执行此操作,而是我想知道STL中是否存在现有的流抽象,只是等待被发现和使用。

    但是,如果唯一的方法是使用C++ 11,那么我想知道。

    最佳答案

    概念代码,未经测试。
    镜像中有很多错误检查和正确的语法。

    struct add : public std::binary_function<int,int,int> {
      int operator() (int a, int b) {return (a + b);}
    };
    
    template<typename inType, typename dType, typename outType, class binFunc>
    outType Transformer(inType& inStream, outType& outStream, binFunc func) {
      dType a, b;
      // Read some data from an input stream
      // Tokenize them based on a specific algorithm
      inStream>> a >> b;
      //outStream << func(a, b);
      return func(a,b); // Process the tokens
    }
    
    int main() {
      std::ifstream in("input.dat", std::ifstream::in); // , std::ios::binary
      std::ofstream out("output.dat");
      struct add adder;  // to Process the tokens
    
      out << Transformer(in, out, adder);
    
      return exit_success;
    }
    

    10-04 15:02
    查看更多