在D中组合不可变构造函数和正规构造函数?

在D中组合不可变构造函数和正规构造函数?,d,immutability,D,Immutability,是否可以编写一个构造函数而不是两个,并且仍然能够创建普通对象和不可变对象?编写普通构造函数和不可变构造函数都需要大量的重复性工作 class ExampleClass { void print() const { writeln(i); } this(int n) { i = n * 5; } this(int n) immutable { i = n * 5; } pr

是否可以编写一个构造函数而不是两个,并且仍然能够创建普通对象和不可变对象?编写普通构造函数和不可变构造函数都需要大量的重复性工作

class ExampleClass
{
    void print() const
    {
        writeln(i);
    }

    this(int n)
    {
        i = n * 5;
    }

    this(int n) immutable
    {
        i = n * 5;
    }

private:
    int i;
}

使构造函数
,它可以隐式转换为任何限定符

this(int n) pure
{
    i = n * 5;
}

auto i = new immutable ExampleClass(2);
auto m = new ExampleClass(3);
此处记录: 如果构造函数可以创建唯一的对象(例如,如果它是纯对象),则该对象可以隐式转换为任何限定符

顺便说一句:其他纯函数的返回值也隐式转换

// returns mutable...
char[] cool() pure {
    return ['c', 'o', 'o', 'l'];
}

void main() {
    char[] c = cool(); // so this obviously works
    string i = cool(); // but since it is pure, this works too
}

同样的原理也在那里发挥作用,它是唯一的,因此可以假定它是共享的或不可变的。

您是对的,这适用于示例案例。然而,在我的实际使用情况下,我必须调用像glCreateShader这样的不纯函数,所以您的解决方案不起作用:/@那么,你真的在创建一个不可变的对象吗?听起来它允许变异,在这种情况下,您可以简单地禁止创建它的不可变实例。@Cubic好吧,确实可以变异对象,因为OpenGL并不真正允许您使资源不可变。Immutable只会阻止将资源id包装器指向更改,并成为“请不要修改此对象”的指导原则。聊天中的快速想法是否有效:创建一个从可变和不可变的构造函数调用的常量帮助器?@AdamD.Ruppe当然,您不能在常量函数中写入成员。但是,如果像这样调用,它可以删除大部分重复的代码
i=helper(n)