heap allocate empty S with variadic ctor

Tobias Pankrath lists at pankrath.net
Sun Nov 4 05:38:19 PST 2012


On 04.11.2012 13:58, Dan wrote:
> This may be a manifestation of bug 1528. In the code below how can I
> heap allocate a default S? I can't seem to get a call to work.
>
> In general structs are stack objects, but is there any problem with
> using the heap to get one?

No, you can get one, but op new returns a pointer to the struct on the heap.

Furthermore if you define your own constructor, your struct will not 
have an no arg constructor anymore.

> ----------------------------------
> import std.stdio;
> import std.traits;
>
> struct T { int t; }
> struct S {
>    T[] ts;
>
>    this(U)(U[] values...) if (isImplicitlyConvertible!(U, T)) {
>      foreach (value; values) {
>        ts ~= value;
>      }
>    }
>    this(this) {
>      ts = ts.dup;
>    }
> }
>
> void main() {
>
>    // S *sp3 = new S; // no no-aro constructor
>    // Same - here but also 'no constructor for S'
 >
>    // S sp3 = new S([]); // you forgot the *.
 >    // this works:
 >    // S* sp3 = new S(cast(T[])[]);

Sadly you have to cast, because typeof([]) is void[]. Alternatively you 
could define an constructor that takes void[] but insists of the 
argument being empty.


>    // Same
>    // S sp3 = new S(); // no no-arg constructor and no *
> }
>

struct S {
   T[] ts;

   this(U)(U[] values...)
         if (isImplicitlyConvertible!(U, T) &&
             !is(U ==  void))
   {
     foreach (value; values) {
       ts ~= value;
     }
   }
   // extra constructor for []
   this(U)(U[] values) if(is(U == void))
   {
         enforce(values.length == 0);
   }

   this(this) {
     ts = ts.dup;
   }
}

// works now too.
S* s = new S([]);




More information about the Digitalmars-d-learn mailing list