2013-03-31 67 views
2

我試圖避免外部函數或遞歸調用,所以我決定測試lambdas的功能,但我被卡住了。如果可能,我將如何使用lambda來解包Args...通過Lambdas解壓縮可變參數

我試圖做std::tie得到的參數爲元組,然後我試着用std::get<I>,其中I是一個非const整數但由於獲取需要constexpr失敗。

我也嘗試初始化列表,我知道會失敗,但值得一試。我不想用維基百科的方式去做。我想這樣做:

任何想法或註定是?

template<typename... Args> 
void fcout(const char* s, Args... args) 
{ 
    std::function<void(Args... A)> Unpack = [&](Args... A) { 
     //Unpack(A...); 
    }; 

    while (*s) 
    { 
     if (*s == '%') 
     { 
      if (*(s + 1) == '%') 
      { 
       ++s; 
      } 
      else 
      { 
       Unpack(args...); 
       fcout(s + 1, args...); 
       return; 
      } 
     } 
     std::cout << *s++; 
    } 
} 
+0

「*我試圖避免外部函數或遞歸調用*」您正在使用可變參數模板;外部函數調用和遞歸*將會發生*。現在最好接受他們。 –

+0

好吧,但我可以使用遞歸lambda的呢?或者是forloop或者某種可能不存在的C++魔法.. – Brandon

+0

我不知道我是否理解你正在努力實現的目標。你可以擴展一下你的目標是什麼?做'A ...'是「解包A」... –

回答

3

如果我理解正確你想達到什麼目的,你可以使用這個簡單的一招:

std::function<void(Args... A)> Unpack = [&](Args... A) { 
    auto l = {((std::cout << A), 0)...}; 
}; 

調用Unpack函數對象將導致所有的參數被插入到std::cout(和,因此,打印到標準輸出)。

+0

:O這足夠接近。我真的想得到每個論點,但我對此感到滿意。我將它放入一個stringstream中。這必須做。 – Brandon

+0

@CantChooseUsernames:好吧,很高興幫助:) –