如何解决使用非平凡的构造函数初始化对象的 std::array
我有一个类定义为
class Edgelet
{
private:
const int e_size;
//Other private members...
public:
//The constructor
explicit Edgelet (int size,Color cl1 = Color::NA,Color cl2 = Color::NA);
//Other public members...
由于类中有一个 const 成员,编译器隐式删除了默认的复制构造函数。需要给它一个参数来初始化。
问题出在课堂上
class Cube
{
private:
std::array <Edgelet,12> c_edgelets;
//Other members...
public:
//The constructor
Cube(int size)
//Other public members...
这个类包含前面类对象的std::array。我如何初始化这个数组? size 参数需要被赋予 std::array 的每个元素来初始化。我想将 std::array 的每个元素设置为 Edgelet(size - 2)
。
当然,我可以使用初始化列表,但由于构造函数有 12 个元素和其他参数,而不是显示,代码变得越来越难看。此外,我用 6 个元素而不是 12 个元素进行了类似的处理。
我也尝试为参数提供默认值,但由于有一个 const 成员,因此以后无法更改该值。我也尝试查看 std::initializer_list 但似乎您无法向其中添加新元素(或者您可以??)。有没有有效的方法来做到这一点?
解决方法
您可以编写辅助类:
template <std::size_t ... Is,typename T>
std::array<T,sizeof...(Is)> make_array_impl(const T& def,std::index_sequence<Is...>)
{
return {{(Is,void(),def)...}};
}
template <std::size_t N,N> make_array(const T& def)
{
return make_array_impl(def,std::make_index_sequence<N>());
}
然后
Cube(int size) : c_edgelets(make_array<12>(Edgelet(size - 2)) {}
,
如果数组成员不是默认可构造的,则必须为每个元素提供一个初始化程序。您可以使用 std::vector
代替 std::array
,而不是这样做。 std::vector
有一个形式为
constexpr vector( size_type count,const T& value,const Allocator& alloc = Allocator());
将构造用 count
初始化的 value
对象。这会让你的代码看起来像
class Cube
{
private:
std::vector<Edgelet> c_edgelets;
//Other members...
public:
//The constructor
Cube(int size) : c_edgelets(12,Edgelet(size - 2)) {}
//Other public members...
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。