如何基于C++可变参数模板定义vector类型的std::tuple成员?
解决方案
直接利用C++模板参数包的展开特性就能实现需求,不需要额外借助std::make_index_sequence(除非你需要对每个vector做更复杂的索引相关操作)。
核心实现
在模板类中直接定义目标tuple类型,通过参数包展开将每个Ts成员包装为std::vector<Ts>:
#include <tuple> #include <vector> template <typename... Ts> class C { public: // 直接展开参数包,生成由各类型对应的vector组成的tuple std::tuple<std::vector<Ts>...> vectors; };
使用示例
下面是一个完整的使用示例,展示如何实例化类并访问其中的vector:
#include <iostream> #include <string> int main() { // 实例化包含int和std::string类型的C类 C<int, std::string> obj; // 获取第一个vector(int类型)并添加元素 std::get<0>(obj.vectors).push_back(42); // 获取第二个vector(string类型)并添加元素 std::get<1>(obj.vectors).push_back("hello"); // 输出验证 std::cout << "int vector element: " << std::get<0>(obj.vectors)[0] << std::endl; std::cout << "string vector element: " << std::get<1>(obj.vectors)[0] << std::endl; return 0; }
关于你尝试的std::make_index_sequence
如果后续需要对tuple中的每个vector执行批量操作(比如统一初始化、遍历等),才需要用到std::make_index_sequence配合展开索引。比如下面的例子展示如何用索引序列初始化所有vector的大小:
template <typename... Ts> class C { public: std::tuple<std::vector<Ts>...> vectors; // 构造函数:初始化所有vector的大小为n explicit C(size_t n) { init_vectors(n, std::index_sequence_for<Ts...>{}); } private: template <size_t... Is> void init_vectors(size_t n, std::index_sequence<Is...>) { // 展开索引,对每个vector调用resize (std::get<Is>(vectors).resize(n), ...); } };
这样实例化C<int, std::string> obj(5);时,两个vector都会被初始化为大小5。
内容的提问来源于stack exchange,提问作者canellas
相关产品推荐
相关产品推荐

