You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:45:03