c++ - 可变参数 lambda 捕获的解决方法

标签 c++ c++11 lambda variadic-templates

我在这里看到了一些与在 lambda 中捕获可变参数的 gcc 错误有关的问题。参见示例:Does lambda capture support variadic template argumentsCompiler bug, or non standard code? - Variadic template capture in lambda .我有以下我想做的人为的例子

#include <iostream>
#include <functional>

class TestVariadicLambda {
public:

    template<typename... Args>
    std::function<void()> getFunc(Args... args) {
        return [=]{ printArgs(args...); };
    }

    template<typename T, typename... Args>
    void printArgs(T value, Args... args) {
        std::cout << value << ", ";
        printArgs(args...);
    }

    void printArgs() {std::cout << "\n";}
};

在 gcc 4.8.2 中我得到以下错误:

../src/TestVariadicLambda.h: In lambda function:
../src/TestVariadicLambda.h:9:25: error: parameter packs not expanded with ‘...’:
   return [=]{ printArgs(args...); };
                         ^
../src/TestVariadicLambda.h:9:25: note:         ‘args’
../src/TestVariadicLambda.h:9:29: error: expansion pattern ‘args’ contains no argument packs
   return [=]{ printArgs(args...); };
                         ^

我的问题是我该如何解决这个问题,因为它在 gcc4.8 中不起作用

最佳答案

以下将起作用。

#include <iostream>
#include <functional>
#include <vector>

std::string to_string(const char* s)
{
    return s;
}

class Test
{
    private:
        void print() {}

    public:
        template<typename T, typename... Args>
        void print(T value, Args... args)
        {
            std::cout << value << "\n";
            print(args...);
        }

        template<typename... Args>
        std::function<void()> getFunc(Args... args)
        {
            using namespace std;
            std::vector<std::string> ArgumentList;
            std::initializer_list<int> {(ArgumentList.push_back(to_string(args)), 0)...};
            return [=] {for (const auto &t : ArgumentList){print(t);}};
        }
};

int main()
{
    Test().getFunc("Hey", 1, 2, 3.0f)();
}

关于c++ - 可变参数 lambda 捕获的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006574/

相关文章:

c++ - 链接 vc6 dll/lib 时未解析的符号

c++ - C++ 错误中的 Operator() 重载和继承

c++ - c++ 的 gsl_function 替代方案

c# - 如何用 lambda 表达式决定应该处理哪个属性?

c++ - 从设备上下文初始化控件的成员变量

c++ - 为什么可以重新设置引用参数?

c++ - 从字符串文字初始化 char 数组

c++ - 将空范围传递给采用一对迭代器的函数的简洁方法是什么?

if-statement - Java8 : Implement multiple conditional statements with stream API

c++ - 我可以让返回类型 auto 与具有相同签名但不同捕获的 lambda 一起使用吗?