【问题标题】:Unpacking Variadic Parameters via Lambdas通过 Lambda 解包可变参数
【发布时间】:2013-03-31 23:54:08
【问题描述】:

我试图避免外部函数或递归调用,所以我决定测试 lambdas 的功能,但我被卡住了。如果可能的话,我将如何使用 lambda 解包 Args...

我尝试使用std::tie 将参数放入元组,然后我尝试使用std::get<I>,其中I 是一个非常量整数,但它失败了,因为get 需要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++;
    }
}

【问题讨论】:

  • "我试图避免外部函数或递归调用" 您正在使用可变参数模板;外部函数调用和递归将会发生。最好现在就接受。
  • 好的,但是我可以使用递归 lambda 吗?或者一个 forloop 或者某种可能不存在的 C++ 魔法..
  • 我不确定我是否理解您想要实现的目标。你能稍微扩展一下你的目标是什么吗?做A... 就是“拆包A”...
  • 我想访问我的 lambda 中 A 的每个值。它不会打开包装。它只是通过了整个事情,所以我不能做 std::cout
  • 一旦你知道你想对它们中的每一个做什么,剩下的就不是太难了。所以你想做的就是std::cout &lt;&lt; args...?你函数的下半部分(while() 的东西)怎么样?这是实现这一目标的尝试吗?

标签: c++ c++11 lambda


【解决方案1】:

如果我正确理解你想要达到的目标,你可以使用这个简单的技巧:

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

调用Unpack 函数对象将导致所有参数都插入std::cout(因此,打印到标准输出)。

【讨论】:

  • :O 这已经足够接近了。我真的很想得到每一个论点,但我对此很满意。我会把它放到一个字符串流中。这是必须要做的。
  • @CantChooseUsernames:好的,很高兴它有帮助:)
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2015-03-02
  • 2013-11-29
  • 1970-01-01
  • 2013-10-09
  • 2015-09-20
相关资源
最近更新 更多