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
相关产品推荐
相关产品推荐

