2017-07-07 28 views
0

有時候需要執行一次特定函數並切換到另一個實現。lambda函數捕獲並修改自己的引用

例如,我通過印刷後的項與所述複製算法一起用於打印定界符流輸出迭代真惱火:

> 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*()>聲明並以某種方式宣佈get_delimauto有效地涉及拉姆達自捕獲的方法嗎?
  • 是否可能有另一種更具表現力(如在Python中)的方式來做那種join
+0

我認爲[這個問題](https://stackoverflow.com/questions/3496982/printing-lists-with-commas-c)關於逗號分隔輸出有一些有趣的想法 –

+0

你將無法使用'auto'因爲lambda類型是唯一的(你將不能爲這種變量賦予不同的lambda)。但爲什麼是lambda?這是一個很好的詭計,但你也可以寫一個簡單的函數,它使用一個帶有if或類似的簡單循環來構造所需的字符串。 – HolyBlackCat

回答

4

在這種情況下,你需要的是:

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

甚至:

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

或者使用""",",如果你願意的話,應該很容易看到如何調整這個以滿足您的需求。


就圖書館去,有一個std::experimental::ostream_joiner

+0

但是每次調用'get_delim'時都會執行std :: exchange? – ovanes

+0

@ovanes指定一個字符相當便宜。 – Barry

+0

嗯,我知道...... :)我只是想了解涉及什麼... – ovanes