如何在C++14类模板的成员初始化列表中初始化数组类型数据成员
解决方案
在C++14中,可以借助std::integer_sequence和编译期索引展开的方式,解决模板参数维度数组的初始化问题,具体实现如下:
#include <utility> class Integer{ public: Integer(int v):value_(v){}; private: int value_; }; template<uint32_t Dim> class Vector{ public: Vector(int v[Dim]) : Vector(v, std::make_integer_sequence<uint32_t, Dim>{}) {} private: template<uint32_t... Indices> Vector(int v[Dim], std::integer_sequence<uint32_t, Indices...>) : value_{v[Indices]...} {} Integer value_[Dim]; };
原理说明
- 编译期索引生成:
std::make_integer_sequence<uint32_t, Dim>会在编译期生成一个包含0,1,...,Dim-1的索引序列,这是C++14标准库提供的工具,定义在<utility>头文件中。 - 辅助构造函数:通过私有模板构造函数接收这个索引序列,利用参数包展开语法
v[Indices]...,将输入数组的每个元素依次传递给Integer的构造函数,完成数组value_的初始化。 - 公共构造函数转发:对外暴露的公共构造函数只需要将输入数组和生成的索引序列转发给辅助构造函数,无需手动处理每个元素的初始化逻辑。
注意:函数参数中的int v[Dim]会退化为指针,但由于Dim是模板参数,编译器能确定数组维度,只要调用者传入的数组确实包含Dim个元素,访问v[Indices]就是安全的。
内容的提问来源于stack exchange,提问作者lei hu
相关产品推荐
相关产品推荐

