如何通过构造函数确定私有std :: array成员的大小?

时间:2019-07-09 02:05:15

标签: c++ arrays constructor

我有一个class B,应该包含一个private std::array<A*>,大小将通过构造函数发送

class B
{
  public:
    B(size_t s) : vv(s,nullptr), aa(s) {}
    // ... more stuff
  private:
    std::vector<A*>   vv;   // vector works fine
    std::array<A*,??> aa;   // but how to initialize an array??
}

使用std::vector可以很好地工作,但似乎无法使其与std::array一起使用。

添加另一个成员const size_t ss并在std::array声明中使用它也不起作用,即使它是static const size_t ss-编译器(VS2019 16.1.5,设置为C ++ 17)声称“ ...预期的编译时常数...”

class B  // another try with a static const size_t
{
  public:
    B(size_t s) : ss(s), aa(s) {}
    // ... more stuff
  private:
    static const size_t ss;
    std::array<A*,ss> aa;   // no, ...expected compile-time constant...
}

该消息似乎暗示没有办法-如果需要在编译时知道大小,则必须相同 >对于该类的所有实例/对象-这直接与我的计划相矛盾。

当然,我可以制作一个模板类,也可以只呆在std::vector上;或我可以使用一种'PIMPL'(代替声明一个指向该数组的指针,并在构造函数中使用new创建它)-这不是问题。

问题是:我可以在构造函数中传递待定数组的大小,然后直接从中创建它吗?
有花哨的构造或技巧吗?

[注意:不是get_text()Initializing private std::array member in the constructorInitializing std::array private member through constructor的副本-我不想传递,但数组的 size ]

2 个答案:

答案 0 :(得分:7)

不能。 std :: array的大小是在编译时确定的,而不是在运行时确定的。对于运行时存储,请使用std :: vector。与类最接近的方法是将该类声明为模板,如下所示:

template<size_t size>
class Foo {
   std::array<size> member;
};

但是,如果要将大小作为arg传递给构造函数,则需要使用std :: vector。

答案 1 :(得分:0)

您可以“假装”将大小传递给构造函数。

template <size_t Size>
struct array_size_t {};

template <size_t Size>
constexpr array_size_t<Size> array_size {};

template <size_t Size>
class Foo {
public:
  explicit Foo(array_size_t<Size>) {}

private:
  std::array<int, Size> arr;
};

Foo foo{array_size<12>};

由于Foo<12> foo;Foo foo{array_size<12>};短得多,因此不确定为什么要使用此代码。