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

C++模板类中如何用小尺寸std::array初始化更大的std::array成员

错误原因

std::array<T, N>和std::array<T, M>是完全独立的两个类型(N和M为大小模板参数),标准库没有为不同大小的std::array提供转换构造函数,因此直接用小尺寸std::array初始化大尺寸对象会触发编译报错。

修复方案

你可以通过索引序列逐位拷贝小尺寸array的元素,剩余位置自动值初始化即可。同时需要先修正原类定义的几个疏漏:

  • 所有构造函数当前为私有权限,外部无法调用,需要移动到public段
  • 析构函数的override修饰仅在类继承自含虚析构的基类时可用,无继承场景可直接删除
  • 代码中用到的current_length_成员变量在原定义中缺失,需要补充

以下是可正常运行的完整实现(C++20及以上版本):

#include <array>
#include <cstdint>
#include <utility>

template<uint32_t MAX_LENGTH>
class A 
{
public:
  A() = default;
  ~A() = default;

  A(const A<MAX_LENGTH>& rhs) :
    current_length_(rhs.get_length()),
    data(rhs.get_data_const())
  { }

  template<uint32_t MAX_LENGTH_RHS, std::enable_if_t<(MAX_LENGTH_RHS < MAX_LENGTH), int> = 0>
  A(const A<MAX_LENGTH_RHS>& rhs) :
    current_length_(rhs.get_length()),
    // 用lambda+索引序列逐位拷贝元素
    data([&]<std::size_t... I>(std::index_sequence<I...>) {
      return std::array<int, MAX_LENGTH>{rhs.get_data_const()[I]...};
    }(std::make_index_sequence<MAX_LENGTH_RHS>{}))
  { }

  template<uint32_t MAX_LENGTH_RHS, std::enable_if_t<(MAX_LENGTH_RHS < MAX_LENGTH), int> = 0>
  A(A<MAX_LENGTH_RHS>&& rhs) :
    current_length_(rhs.get_length()),
    data([&]<std::size_t... I>(std::index_sequence<I...>) {
      return std::array<int, MAX_LENGTH>{std::move(rhs.get_data()[I])...};
    }(std::make_index_sequence<MAX_LENGTH_RHS>{}))
  { }

  uint32_t get_length() const { return current_length_; }
  const std::array<int, MAX_LENGTH>& get_data_const() const { return data; }
  std::array<int, MAX_LENGTH>& get_data() { return data; }
 
private:
  uint32_t current_length_ = 0;
  std::array<int, MAX_LENGTH> data;
};

如果需要兼容C++14版本,可以把lambda的逻辑抽成私有辅助静态函数实现:

template <std::size_t TargetLen, std::size_t SrcLen, std::size_t... I>
static std::array<int, TargetLen> copy_array(const std::array<int, SrcLen>& src, std::index_sequence<I...>) {
  return std::array<int, TargetLen>{src[I]...};
}

// 对应构造函数的data初始化改为:
data(copy_array<MAX_LENGTH>(rhs.get_data_const(), std::make_index_sequence<MAX_LENGTH_RHS>{}))

以上实现可以正常编译你给出的测试代码:

int main() {
  A<5> a5;
  A<10> a10(a5);
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:24:02