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

如何向基类传递数组的std::span?若不可行,传递数组const引用可行吗?

问题描述

我想了解如何向基类传递数组的std::span?若该方法不可行,传递数组的const引用是否可行?问题在于std::span和数组都需要显式尺寸作为模板参数,因此基类需获取该尺寸信息。目前我使用vector实现此需求。

我尝试编写如下代码:

enum Seasons {
  Spring, Summer, Fall, Winter
};

struct Base {
    template<size_t N>
    Base(std::span<Seasons, N> list) {}
};

struct Derrived : Base {
  inline static const std::array mValues = {
      Spring, Winter
  };

  Derrived() : Base(???) {}
};
解决方案

1. 传递std::span的可行方案

你的代码中,std::array可以直接隐式转换为std::span,编译器会自动推导模板参数N的大小。派生类构造函数里直接传入mValues即可,也可以显式构造std::span增强可读性:

// 方式1:利用隐式转换直接传入std::array
Derrived() : Base(mValues) {}

// 方式2:显式构造std::span(代码意图更明确)
Derrived() : Base(std::span{mValues}) {}

编译期会根据mValues的实际尺寸(此处为2)自动推导Base构造函数的模板参数N=2,完全满足你获取尺寸信息的需求。

2. 传递数组const引用的替代方案

如果不想使用std::span,也可以直接传递数组的const引用,基类通过模板推导尺寸:

方案A:传递std::array的const引用

struct Base {
    template<size_t N>
    Base(const std::array<Seasons, N>& list) {}
};

struct Derrived : Base {
  inline static const std::array<Seasons, 2> mValues = {Spring, Winter};

  Derrived() : Base(mValues) {}
};

方案B:传递原生数组的const引用

如果使用的是原生数组而非std::array,可以这样实现:

struct Base {
    template<size_t N>
    Base(const Seasons (&list)[N]) {}
};

struct Derrived : Base {
  inline static const Seasons mValues[] = {Spring, Winter};

  Derrived() : Base(mValues) {}
};

3. 和vector实现的对比

  • 使用std::span或数组引用:尺寸在编译期确定,无需动态内存分配,性能更优,且能让基类在编译期获取精确的尺寸信息。
  • 使用vector:尺寸支持运行时动态修改,但会带来内存分配的开销,且基类无法在编译期确定数组尺寸。

如果你的数组尺寸固定,std::span或数组引用是比vector更高效的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:43:26