问题描述
我想通过这个简单的例子来提问:我如何从可变参数包中获取最后一个值和 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
}
,
尽管您将问题标记为 c++14,但我认为值得注意的是,如果使用折叠表达式和 constexpr,c++17 解决方案要简单得多:
整体:
template <typename... Types>
void print(Types... args)
{
if constexpr (sizeof...(Types) == 0)
std::cout << "Empty";
else
std::cout << (args,...);
}
折叠扩展为使用逗号运算符,它计算每个参数并丢弃结果,直到达到最后一个。最后一项的计算结果成为整个表达式的值,并被打印出来。