如何结合参数包与另一类型列表构建新类型?
实现方案
核心思路确实是借助std::index_sequence关联参数包位置与typeLists的对应类型,具体需要拆分对外接口和带索引序列的内部实现函数,步骤如下:
1. 预定义类型列表与相关结构
先明确你的typeLists及配套的SomeClass、bar函数(这里用示例类型演示):
#include <tuple> #include <utility> // 提供index_sequence相关工具 // 替换成你实际的预计算类型列表 using typeLists = std::tuple<int, double, std::string>; template<typename T1, typename T2> struct SomeClass { const T1& val; SomeClass(const T1& v) : val(v) {} }; // 示例bar函数,匹配不同的SomeClass实例 void bar(const SomeClass<int, int>&) {} void bar(const SomeClass<double, double>&) {} void bar(const SomeClass<std::string, std::string>&) {}
2. 拆分接口与实现
对外的foo函数仅负责接收参数包,生成对应长度的索引序列后转发给内部实现:
// 内部实现:通过索引序列关联参数包位置与typeLists的类型 template<typename... Args, std::size_t... Is> void foo_impl(const Args&... args, std::index_sequence<Is...>) { // 展开时,用std::tuple_element_t取出typeLists对应位置的类型 bar( SomeClass<Args, std::tuple_element_t<Is, typeLists>>{ args }... ); } // 对外接口:生成匹配参数包长度的index_sequence template<typename... Args> void foo(const Args&... args) { // 强制校验参数包大小与typeLists类型数量一致 static_assert(sizeof...(Args) == std::tuple_size_v<typeLists>, "参数包大小必须与typeLists的类型数量匹配"); foo_impl(args..., std::make_index_sequence<sizeof...(Args)>{}); }
3. 关键逻辑说明
std::make_index_sequence<sizeof...(Args)>会生成从0到sizeof...(Args)-1的索引序列,比如参数包有3个元素时,生成std::index_sequence<0,1,2>- 在
foo_impl中,每个Is对应参数包的第Is个元素位置,std::tuple_element_t<Is, typeLists>可以精准取出typeLists中对应位置的类型 - 最终通过参数包展开,将每个
Args元素与对应位置的typeLists类型组合成SomeClass实例,传递给bar
测试示例
#include <string> int main() { foo(1, 3.14, std::string("test")); return 0; }
内容的提问来源于stack exchange,提问作者zmz
相关产品推荐
相关产品推荐

