Explicit default constructor for structs

Atila Neves atila.neves at gmail.com
Thu Apr 10 10:37:17 PDT 2014


+1

Atila

>
> Yeah. For sure.
>
> Or a named function: auto foo = foo();
> Or a make template:  auto foo = make!Foo();
> Or a dummy argument: auto foo = Foo(Foo.dummy);
> Or ditto with a global dummy:  auto foo = Foo(dummyArg);
> Or use a static opCall:        auto foo = Foo();
> Or use an initialize function: Foo foo; foo.initialize();
>
> I mean: Why complain when there are at least 10 *different* 
> solutions at our disposal? Who doesn't love re-inventing the 
> same functionality over and over and over again? But more 
> importantly, who doesn't just *love* reading the documentation 
> that explains *which* approach the damn type chose for run-time 
> initialization. Yummy!
>
> Also, any kind of "Factory" solution has a postblit overhead if 
> you try to emplace it. Or would require a temporary with some 
> complex "uninitializedMove". No postblit, but still overhead.
>
> --------
>
> Being serious again, if the language isn't going to do 
> something to address the issue, we *should* have a uniform 
> library solution.
>
> I think the "make" template could be a good approach. It could 
> be a universal construction scheme, with "opt-in" no-arg 
> construction:
>
> static struct NoArg {}
> enum noArgToken;
>
> template make(T)
> {
>     //And some switches to handle non-struct types too.
>
>     T make(Args...)(auto ref Args args)
>     {
>         static if (Args.length)
>             return T(args);
>         else
>         {
>             static if (is(typeof(T(noArgToken))));
>                 return T(noArgToken);
>             else
>                 return T();
>         }
>     }
> }
>
> struct S1
> {
>     int* p;
>     @disable this();
>     this(NoArg) //Opt-in no-arg constructor
>     {p = new int;}
> }
> struct S2
> {
>     int i;
> }
>
> void main()
> {
>     S1 s11; //FAils to compile (disabled this());
>     auto s12 = S1.init; //Explicit request for static default 
> initialization;
>     auto s13 = make!S1(); //run-time construction request.
>
>     auto s2 = make!S2(); //run-time construction request. Does 
> nothing particular.
> }
>
> This has the advantage (IMO) of being explicit and universal. 
> Also, it's an actual construction scheme, so 
> `emplace(noArgToken)` would call an actual constructor.
>
> Furthermore, it could also allow a universal construction 
> scheme for items, regardless of struct/class/integral etc...


More information about the Digitalmars-d mailing list