Arrays 在D中对数组使用构造函数

Arrays 在D中对数组使用构造函数,arrays,constructor,d,dynamic-arrays,Arrays,Constructor,D,Dynamic Arrays,当分配一个具有新属性的数组时,如何调用构造函数 例如,在下面的代码中,我如何为A的每个实例化调用构造函数,为所有10个元素将b初始化为5 void main() { A[] a = new A[10]; } class A { int b; this(int init) { b = init; } } 我猜这是不可能的,但我希望…一个简单的循环就可以了(而且它是最可读的) 也可以使用数组初始值设定项: A[] a=[new A(5),new A

当分配一个具有新属性的数组时,如何调用构造函数

例如,在下面的代码中,我如何为A的每个实例化调用构造函数,为所有10个元素将b初始化为5

void main() {
    A[] a = new A[10];
}

class A {
    int b;
    this(int init) {
        b = init;
    }
}
我猜这是不可能的,但我希望…

一个简单的循环就可以了(而且它是最可读的)

也可以使用数组初始值设定项:

A[] a=[new A(5),new A(5),new A(5),new A(5),new A(5),
       new A(5),new A(5),new A(5),new A(5),new A(5)];

如果处理的是值类型,则可以使用std.array.replicate

auto a = replicate([5], 50);
将创建长度为50的
int[]
,其中每个元素为5。可以对引用类型执行相同的操作,但所有元素都将引用同一对象

auto a = replicate([new A(5)], 50);
将只调用
A
的构造函数一次,您将得到一个
A[]
,其中所有元素都引用同一个对象。如果希望它们引用单独的对象,则必须单独设置每个元素

auto a = new A[](50);
foreach(ref e; a)
    e = new A(5);
或者用一个文本初始化整个数组

auto a = [new A(5), new A(5), new A(5)];

但这显然只适用于相对较小的数组。

如果您真的想在一行中完成,可以编写一个宏来完成。我从其他答案中借用了实际初始化的代码

template allocate(T) {
    T[] allocate(int size, int arg) {
        T[] result = new T[size];
        foreach(ref el; result)
            el=new T(arg);
        return result;
    }
}
然后,您可以使用以下方法一次分配10个元素的整个数组:

A[] a = allocate!(A)(10, 5);
当然,这有固定的构造函数参数,但是您可能可以使用模板的可变参数和一些mixin来生成正确的构造函数调用

A[] a = allocate!(A)(10, 5);