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

C++使用可变参数模板时如何获取第N个模板参数的类型

你需要先实现一个编译期元函数,从可变参数模板的参数包里按索引提取对应类型,实现方式如下:

方案1:手动实现元函数(兼容C++11及以上版本)

// 基础模板声明
template<unsigned int Index, typename... Types>
struct get_nth_from_variadric;

// 递归终止:索引为0时取首个参数类型
template<typename FirstType, typename... RestTypes>
struct get_nth_from_variadric<0, FirstType, RestTypes...>
{
    using type = FirstType;
};

// 递归迭代:索引减1,跳过首个参数继续匹配
template<unsigned int Index, typename FirstType, typename... RestTypes>
struct get_nth_from_variadric<Index, FirstType, RestTypes...>
{
    using type = typename get_nth_from_variadric<Index - 1, RestTypes...>::type;
};

// 便捷别名模板,减少typename嵌套写法
template<unsigned int Index, typename... Types>
using get_nth_from_variadric_t = typename get_nth_from_variadric<Index, Types...>::type;

方案2:借助标准库简化实现(兼容C++14及以上版本)

可以直接复用std::tuple_element的能力,无需手动写递归,无额外运行时开销:

#include <tuple>

template<unsigned int Index, typename... Types>
using get_nth_from_variadric_t = typename std::tuple_element<Index, std::tuple<Types...>>::type;

调整你的ResultRow实现

将返回值替换为上面的别名模板即可:

// 你的按需加载逻辑保持不变
template<typename TVal>
TVal valueGetter() { /* 原有实现 */ }

template<typename ...TColValue>
class ResultRow
{
public:
  template<unsigned int TIndex>
  get_nth_from_variadric_t<TIndex, TColValue...> GetValue() const
  {
    return valueGetter<get_nth_from_variadric_t<TIndex, TColValue...>>();
  }
};

使用效果

完全符合你预期的调用方式:

ResultRow<bool, int> row;
int myVal = row.GetValue<1>(); // 正确返回int类型
bool flag = row.GetValue<0>(); // 正确返回bool类型

如果传入的索引超出了参数包的长度,会直接在编译期抛出错误,不会产生运行时问题。


内容的提问来源于stack exchange,提问作者Tomáš Zato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:48:03