【问题标题】:how to access variadic lambda function arguements如何访问可变参数 lambda 函数参数
【发布时间】:2017-06-12 23:34:16
【问题描述】:

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

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

示例 - 旧用法:

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 中的单个参数,而不是一次性访问所有参数

【问题讨论】:

    标签: c++ lambda variadic-templates c++17


    【解决方案1】:

    这是我最终得到的结果:

    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 类型作为矢量,有什么魔力

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      【讨论】:

      • 我看过这部分 const int dummy[] = {0, ((std::cout &lt;&lt; args), 0)...}; 但是我真的不明白那里发生了什么 - 你能详细说明一下吗?
      • 哇哦 - 你真的救了我的一天 - 给你最高排名
      • 我无法让 C++17 版本工作 - 你将如何为此编写你的 makefile?一定是我的有问题
      • 看来结合这个解决方案和关注stackoverflow.com/a/7232968/3990012可以做出更完整的解决方案
      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2022-01-01
      • 1970-01-01
      • 2021-03-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多