例如,我有以下C ++类:
struct A {
A(const int value) {}
};
如果我想要一个对象,我可以这样做:
A a = A(3);
我想构建其中的10个对象,我不知道如何静态实例化。
A a[10]; // This won't compile, as struct A constructor needs an argument
我可以使用指针A *a
,然后逐个创建对象,但我不确定C++11
中是否有新功能可以让我可以静态地执行这些操作?
答案 0 :(得分:7)
答案 1 :(得分:-1)
如果要对A
的所有实例使用相同的参数,可以使用支持函数,如下所示:
#include <array>
#include <cstddef>
#include <functional>
#include <cassert>
struct A {
A(int value): v{value} { }
template<std::size_t... I>
static A* create(std::index_sequence<I...>, int val) {
return new A[sizeof...(I)]{ (I, val)... };
}
template<std::size_t N>
static A* create(int val) {
return create(std::make_index_sequence<N>(), val);
}
int v;
};
int main() {
A *arr = A::create<10>(42);
for(int i = 0; i < 10; i++) assert(arr[i].v == 42);
delete[] arr;
}
基本的想法是让它创建N
A
val
个实例的新数组,并在构造过程中为所有实例使用相同的参数std::make_index_sequence
。
注意强>
自修订版C ++ 14以来, std::index_sequence
和autoProcessQueue
是游戏的一部分。如果你不能在线使用它们,你可以找到一个C ++ 11实现,它可以帮助你使用几乎相同的代码: