2017-07-07 22 views
0

特定の関数を一度実行し、別の実装に切り替える必要があることがあります。ラムダ関数が独自の参照を取得して変更する

例えば、私はコピーアルゴリズムと一緒に印刷されている項目の後に区切り文字を出力ストリーム出力イテレータによって本当にイライラしています:

> 1,2,3,4, 
     ^---- this is what happens in that case 

質問を約きれいにアイテムを印刷するが、よりされていませんそれらを正しく連結することについて。

例えばPythonはstring.join機能を使用して、正しい結果を生成します。我々は唯一の最初の実行後にスイッチを作るために一度必要があるため

','.join((1,2,3,4)) 
> 1,2,3,4 

は、私はまた、if/else声明を避けたいです。だから私が思いついたものを、次のとおりです。

std::function<char const*()> get_delim; 

get_delim = [&get_delim]() 
{ 
    get_delim = [](){ return ","; }; 
    return ""; 
}; 

for(auto b : some_byte_range) 
    std::cout << get_delim() << b; 

bは、私の場合には、単にバイトですが、私はauto const&を使用していない理由です。

は今の質問:

  • std::function<char const*()>宣言を取り除くと、何らかの形で効果的にラムダの自己キャプチャを伴うautoget_delimを宣言する取得する方法はありますか?
  • joinのように表現力豊かな(Pythonのような)別の方法があるかもしれませんか?この場合
+0

コンマ区切りの出力に関する[この質問](https://stackoverflow.com/questions/3496982/printing-lists-with-commas-c)にはいくつか興味深いアイディアがあります。 –

+0

あなたは使用できませんラムダ型は一意であるため(この変数に別のラムダを割り当てることはできません)、 'auto'です。しかしなぜラムダですか?それは素敵なトリッキーですが、同様のものを使った単純なループを使って必要な文字列を作成する単純な関数を書くこともできます。 – HolyBlackCat

答えて

4

、あなたが必要なのは、次のとおりです、

auto get_delim = [c=char(0)]() mutable { return std::exchange(c, ','); } 

それとも好みなら""","を使用し、これを調整する方法を確認するために簡単なはず:

auto get_delim = [c=char(0)]() mutable { 
    char cur = c; 
    c = ','; 
    return cur; 
}; 

あるいはあなたのニーズに合わせて


ライブラリーに行く限り、std::experimental::ostream_joinerがあります。

+0

しかし、それは 'get_delim'が呼び出されるたびにstd :: exchangeを実行するでしょうか? – ovanes

+0

@ovanes charの割り当てはかなり安いです。 – Barry

+0

まあ、私はそれを知っている... :)私はちょうど関与しているものを理解しようとしています... – ovanes

関連する問題