On 05/30/2013 04:48 PM, Ali Çehreli wrote:

> For classes, there is no syntax for copying. The type may have annotated
> a member function that it is the duplication function or we may know by
> convention that dup() is the equivalent of array .dup.

Kenji Hara responded to another thread on the main D newsgroup. Apparently, such a convention-based functionality is already being used by std.conv.to. Here is the excerpt:

On 05/30/2013 07:13 PM, Kenji Hara wrote:

> Current D does not provide generic way for deep copy of class object.
> But, you can use std.conv.to with adding a kind of copy constructor.
>
> class C
> {
>      int x;
>      this(int n) { x = n; }
>
>      // Do deep copy, this is used by to!(array-type)(array)
>      this(const C c) { this.x = c.x; }
> }
> void main()
> {
>      const(C)[] carr = [new C(1), new C(2)];
>      // C[] marr = carr.dup;
>      // --> Error: cannot implicitly convert element type const(C) to
> mutable in carr.dup
>
>      import std.conv;
>      C[] marr = carr.to!(C[]);
>      // For class arrays which need copy elements,
>      // std.conv.to returns [new C(carr[0]), new C(carr[1]), ...]
>
>      // modify element of returned array
>      marr[0].x = 5;
>
>      // Right now carr[0] and marr[0] are completely unrelated objects
>      assert(carr[0].x == 1);
>      assert(marr[0].x == 5);
> }
>
> Kenji Hara

Ali

Reply via email to