C ++对象实例化的数组(我试图找到编译时解决方案)

时间:2016-07-28 21:01:01

标签: c++ c++11

例如,我有以下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中是否有新功能可以让我可以静态地执行这些操作?

2 个答案:

答案 0 :(得分:7)

列表初始化允许您编写

A a[10]{0,1,2,3,4,5,6,7,8,9};

列表中的每个元素都将传递给A的构造函数。

Live demo

答案 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_sequenceautoProcessQueue是游戏的一部分。如果你不能在线使用它们,你可以找到一个C ++ 11实现,它可以帮助你使用几乎相同的代码: