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

如何通过可变参数模板函数将std::vector参数包转为std::span参数包?

解决方案

原代码的核心问题是函数无法直接返回多个独立的值,你试图展开返回多个std::span,但C++函数只能返回单个对象。需要把这些span打包成std::tuple返回,同时参数传递要避免不必要的拷贝。

修正后的代码如下:

#include <vector>
#include <span>
#include <tuple>

template <typename... Ts>
constexpr auto getSpans(std::vector<Ts>&... vecs) {
    return std::make_tuple(std::span<Ts>(vecs)...);
}

// 支持const vector的重载,保证const正确性
template <typename... Ts>
constexpr auto getSpans(const std::vector<Ts>&... vecs) {
    return std::make_tuple(std::span<const Ts>(vecs)...);
}

关键说明

  • 用std::tuple打包所有生成的std::span,这是C++中返回多个值的标准方式。
  • 参数使用左值引用std::vector<Ts>&,避免拷贝整个vector,同时允许通过span修改原容器元素。
  • 新增const重载,适配传入const vector的场景,生成只读的std::span<const Ts>。
  • std::make_tuple会自动推导tuple的类型,比手动声明std::tuple<std::span<Ts>...>更简洁。

使用示例

#include <iostream>

int main() {
    std::vector<int> v1 = {1,2,3};
    std::vector<double> v2 = {4.5, 6.7};
    std::vector<std::string> v3 = {"a", "b"};

    auto spans = getSpans(v1, v2, v3);
    // 通过std::get访问对应位置的span
    std::span<int> s1 = std::get<0>(spans);
    std::span<double> s2 = std::get<1>(spans);

    for (int num : s1) {
        std::cout << num << " ";
    }
    std::cout << "\n";
    for (double num : s2) {
        std::cout << num << " ";
    }
}

内容的提问来源于stack exchange,提问作者Romain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:29:53