从可变参数中只取一个值

问题描述

我想通过这个简单的例子来提问:我如何从可变参数包中获取最后一个值和 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,3.14);
  
    return 0;
}

解决方法

使用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

,

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

整体:

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

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