5

私は、Haskell と関数型言語全般で多くの作業を行った後、C++ を学んでおり、常に同じ問題を解決しようとしていることがわかりました。

  • 入力ストリームからデータを読み取る
  • 特定のアルゴリズムに基づいてそれらをトークン化する
  • トークンを処理する

これが Haskell の場合、すべてが怠惰であるという事実を単純に利用して、考えながら変換を記述すれば、ダウンストリームが消費されるときに適用されます。この正確なパターンを実行するライブラリさえあります (コンジットおよびパイプ)。

1 2 3 4 5 6 ...シーケンスと出力を取得したいとしましょう12 34 56 ...。ストリーム上で動作し、その場でデータを処理するアドホック コードの書き方がわかります。しかし、別のストリームからデータを (考えられる方法で) 変換することにより、新しいストリームを構築できる抽象化メカニズムがあるかどうかを知りたいです。この抽象化により、単一の要素を新しい値に単純にマッピングするだけでなく、処理中にデータをバッファリングできるようになります。

制限事項は次のとおりです。

  • stdlib 以外のライブラリは使用できません。
  • C++03 で動作する必要があります (C++11 の機能がないことを意味します)。

と思ったら、これは宿題ですか?そうですね、データのストリームを操作する必要がある多くのクラス割り当てを取得しています (これが、ライブラリと C++03 の制限がない理由です)。ループを使用してこれを行う方法がわからないわけではありませんがwhile、stl に既存のストリーム抽象化が存在するかどうかを知りたいのですが、発見されて使用されるのを待っています。

しかし、これを行う唯一の方法が C++11 を使用することである場合は、知りたいです。

4

2 に答える 2

2

テストされていない概念コード。多くのエラーチェックと正しい構文があることを想像してください。

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;
}
于 2014-10-12T08:41:53.837 に答える
0

以下は、ライブラリなしのソリューションの必要性に適合しません(コメントとして残すのに十分な評判がありません)。ただし、機能的な考え方には便利です。

David Sankel は C++Now 2014 で C++ を使用した FRP について素晴らしい講演を行いました。

ビデオはここにあります: https://www.youtube.com/watch?v=tyaYLGQSr4g&list=UU5e__RG9K3cHrPotPABnrwg

スライドはビデオの説明にリンクされており、スライドの最後に github リンクがあります。

ここからもインスピレーションを得られると思います: http://ericniebler.com/2013/11/07/input-iterators-vs-input-ranges/

ストリーム イテレータを使用した std::transform は、主に必要なことを行う必要があります。

于 2014-10-15T15:24:12.940 に答える