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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:12:40