2013-03-31 32 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:好吧,很高兴帮助:) –