std::fscanf()
という幾分兄弟を作りたいと思っています(私はそれがCの関数だと知っています)。私はそれだけで一つの配列(引数の一部)ではなく、引数とフォーマットを維持するために、プログラマを必要とするので、コンソールからの読み取りのC#バージョンを実装することを決定した(疑似)実行時に可変長テンプレートパックを反復処理する方法は?
template <charT, char_traits, ...>
std::size_t ts_scanf(is, format, opening_bracket, closing_bracket, args)
:だから、私のインターフェイスは、このようなものです。ここ
方法C#バージョン作品です
"text blah blah blah {0} {1} {0}", arg1, arg2
だから、ARG1の種類、ARG2を推論し、次に{N}は、適切な引数に待機位置にテキストを読み取ります。
私が何をしたいのアルゴリズム:int型を解析する
1.Findオープニングブラケット
2.Try、N
3.Ifはが成功したと言う、N番目のパラメータを取得しますパックから、is>>get<N>args
を使用してそれを読んでください。失敗した4.if
、ダムは、フォーマットの最後まで4に
5.Repeat 1を読んだり、流れがそう
を使い果たすまでループを書くとき、私は問題が発生し実行します。
をfor (i = 0; i < length; i = format.find(i, opening_bracket))
パラメータパックargs
を何とか展開する必要があることがわかりました。これは実行時には不可能です(ループは実行時です)。私が念頭に置いている唯一の解決策は、反復的な解決策です:オープニングブラケットを見つけるときにそれを読んで、フォーマット文字列をトリミングし、トリミングされた文字列と残りのバリッドパックで再帰します。
質問:は、(擬似)実行時に可変長パックを展開することが可能な解決策がありますか?
「opening_bracket」と「closing_bracket」とは何ですか?なぜそれが必要ですか? 'fscanf'にはAFAIKのようなものはありません。あなたがそれを働かせたいと思う方法に関する擬似コードは、それを言葉で表現するよりも説明するのに長い道のりがあります。 – Arunmu
@Arunmu、ありがとうございました。 – Incomputable
あなたが本当に効率的にやりたければ、式テンプレートを使ってコンパイル時にそれを達成する必要があります(マッピング)。これは 'boost :: proto'を使って行うことができますが、私はそれが弱い心のためではないことを認めます:)。私が知っている他の解決策は、実行時にのみブラケットを解析するため、純粋にランタイムです。これには、実行時コンテナにargsを格納することが含まれます。 – Arunmu