如何向基类传递数组的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
相关产品推荐
相关产品推荐

