我有一个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 constructor或Initializing std::array private member through constructor的副本-我不想传递值,但数组的 size ]
答案 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>};
短得多,因此不确定为什么要使用此代码。