如何访问可变 lambda 函数参数

how to access variadic lambda function arguements

这里有很多关于可变参数通用 lambda 函数的文章,但是我想要一个关于如何访问 lambda 函数内部参数的简单解释

点。我正在使用旧设置来获取参数,但是我想要一个更通用的解决方案

示例 - 旧用法:

auto lambda = [](...)                              
{                                                  
    va_list args;                                  
    va_start(args,0);                              
    auto b = va_arg(args, const char*);            
    cout << "hello " << b << endl;           
    va_end(args);                                  
};                                                 

lambda();                                      
lambda("world");                                 

显示这个:

hello
hello world

我想知道是否可以在 lambda 函数上使用可变参数模板将其重构为更通用的解决方案

还有如何访问 lambda 内部的各个参数,而不是一次访问所有参数

您可以这样做:

auto lambda = [](const auto&...args)
{
    std::cout << "hello ";
    const int dummy[] = {0, ((std::cout << args), 0)...};
    static_cast<void>(dummy);
    std::cout << std::endl;
};

或者在 C++17 中使用折叠表达式:

auto lambda = [](const auto&...args)
{
    (std::cout << "hello " << ... << args) << std::endl;
};

这是我最终得到的结果:

auto lambda = [](const auto&...args)                                  
{                                                                      
    typedef boost::variant<int, float, std::string> Variant;           
    std::vector<Variant> vec = {args...};                              
    std::cout << "hello ";                                             
    for(auto a: vec) {                                                 
        std::cout << a;                                                
    }                                                                  
    std::cout << std::endl;                                            
};                                                                     

lambda("world", " and ", "universe");     

显示如下:

hello world and universe

似乎对向量使用了 Variant 类型,这很神奇