C++如何从可变参数包中提取最后一个值并单独打印输出
C++ 可变参数包提取最后一个值实现方案
方案1:C++17 及以上版本(写法最简)
C++17 引入的tuple相关工具可以直接通过参数包下标获取最后一个元素,无需递归:
#include <iostream> #include <tuple> using namespace std; void print() { cout << "--empty--"; } template<typename T> void print(T x) { std::cout << "Last Value from variadic pack--" << x; } template <typename... Types> void print(Types... args) { // 计算参数包长度,取最后一个下标对应元素 auto x = std::get<sizeof...(args) - 1>(std::tie(args...)); print(x); } int main() { print(1, 2, 3.14); // 输出:Last Value from variadic pack--3.14 return 0; }
- 实现原理:用
std::tie把所有参数打包成tuple,再通过sizeof...(args)获取参数包总长度,取长度减1的下标对应元素即为最后一个值。
方案2:兼容C++11/14的递归实现
如果编译器不支持C++17,可以用可变参数递归的方式逐层剥离参数,直到剩下最后一个参数:
#include <iostream> using namespace std; void print() { cout << "--empty--"; } // 递归终止条件:只剩一个参数时调用该函数 template<typename T> void print(T x) { std::cout << "Last Value from variadic pack--" << x; } // 递归逻辑:每次剥离第一个参数,把剩余参数包继续传递 template <typename T, typename... Types> void print(T var1, Types... var2) { print(var2...); } int main() { print(1, 2, 3.14); // 输出:Last Value from variadic pack--3.14 return 0; }
- 实现原理:每次调用可变参数版本的print时,忽略当前传入的第一个参数,只把剩余的参数包继续传递,直到参数包只剩1个元素时,匹配到单参数的print函数,直接输出最后一个值。
方案对比:C++17 版本编译效率更高,无递归开销;递归方案兼容性更好,可支持老旧编译器。
内容的提问来源于stack exchange,提问作者Dan Flick
相关产品推荐
相关产品推荐

