如何访问可变参数 lambda 函数参数

how to access variadic lambda function arguements

本文关键字:参数 变参 lambda 函数 何访问 访问      更新时间:2023-10-16

这里有很多关于可变参数泛型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)                                  
{                                                                      
    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

似乎使用变量类型作为矢量,魔术

你可以做这样的事情:

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;
};