【问题标题】:Take only one value from variadic从可变参数中只取一个值
【发布时间】:2021-05-28 12:16:39
【问题描述】:

我想通过这个简单的例子来问:我如何从可变参数包和print(1, 2, 3.14) 中获取最后一个值来调用print(3,14)

void print()
{
   cout<<"--empty--";
}

void print(x)
{
    std::cout<<"Last Value from variadic pac--" << x;
}
      
template <typename T, typename... Types>
void print(T var1, Types... var2)
{ 
   int x = // last value from variadic pac : 3.14
   print(x) // 3.14 
}
  
int main()
{
    print(1, 2, 3.14);
  
    return 0;
}

【问题讨论】:

    标签: c++ c++11 c++14


    【解决方案1】:

    使用std::tuple,您可能会这样做

    template <typename T, typename... Types>
    void print(T var1, Types... var2)
    { 
       auto x = std::get<sizeof...(Types) - 1>(std::tie(var2...));
       print(x); // 3.14 
    }
    

    Demo

    【讨论】:

    • 谢谢@Jarod42,改成模板 void print(T var1, Types... var2) { auto x = std::get(std::tie(var2)); print(x) // 3.14 } 我得到了错误:参数包没有用'...'扩展:
    • 也许您可以删除 typename T/T var1 部分(以防仅使用参数调用该函数)。或者您可以维护var1,但将其添加到元组中。
    • @DanFlick:修正了错字,并添加了链接演示。
    • @max66: OP 为上面的 0/1 参数提供了重载,因此不需要。
    • 我应该将 auto x = std::get(std::tie(var2...)) 更改为什么以获得第一个元素来自 pac ?
    【解决方案2】:

    尽管您将问题标记为 c++14,但我认为值得注意的是,使用 fold 表达式和 constexpr if 的 c++17 解决方案要简单得多:

    全文:

    template <typename... Types>
    void print(Types... args)
    { 
        if constexpr (sizeof...(Types) == 0)
            std::cout << "Empty";
        else
            std::cout << (args, ...);
    }
    

    折叠扩展为使用逗号运算符,它评估每个参数并丢弃结果,直到到达最后一个。最后一项的求值成为整个表达式的值,并打印出来。

    【讨论】:

    • 谢谢,但我需要 c++14 解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2016-06-16
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多