C ++如何从构造函数中的数组参数初始化/复制const数组成员

问题描述

以下类旨在存储单个 bool 和一个包含 100 个整数的数组。我想要一个构造函数,它将单个 bool 和一个 100 元素的数组(然后复制到对象中)作为参数。明显的写法如下

class Info {

private:
    const int contents[100];
    const bool symmetric;
public:
    Info (const int contents[100],bool symmetric) : contents(contents),symmetric(symmetric) {}
    // ...
};

但不幸的是,这不会编译,成员初始化列表中的内容参数(该行的第三个 contents)似乎被视为一个指针。

我可以让它工作还是这是一个 C++ 限制?

  • 出于空间和效率原因,我不想使用 std::arraystd::vector。 [编辑] 我的是一个 C++ 语法问题,而不是关于 std::array 是否有效。在不允许使用 std::array 的相关情况下,答案可能很有用。 [结束编辑]
  • 在构造函数体中初始化不起作用,因为 contentsconst

我使用 C++14 和 clang(Linux 中的 CLion)并且来自 Java 世界。

解决方法

除了 std::array 之外,还有另一种方式,但您应该使用模板并使用可变参数功能。

让我们假设元素的数量是 amount 然后首先像这样声明你的类:

#include <utility>

template<size_t amount,typename = std::make_index_sequence<amount> >
class Info;

然后将您的类定义如下:

template<size_t amount,size_t ... _Idx>
class Info<amount,std::integer_sequence<size_t,_Idx...> > {
private:
    const int contents[amount];
    const bool symmetric;
public:
    Info (const int contents_[amount],bool symmetric_) : contents{contents_[_Idx]...},symmetric(symmetric_) {}
};

现在您可以毫无问题地使用您的课程:

    const int preinfo[3] = {1,2,3};
    Info<3> minfo(preinfo,true);

此方法将使其速度非常快,但请注意,没有任何东西是免费的,使用此代码将使您的代码在编译后生成更大的二进制文件!