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
相关产品推荐
相关产品推荐

