Template argument deduction fails with alias

Paul Backus snarwin at gmail.com
Tue Sep 1 11:10:00 UTC 2020


On Tuesday, 1 September 2020 at 02:48:08 UTC, Ben Jones wrote:
>
> Thanks all.
>
> I tried using alias this at first and then I get errors trying 
> to construct AliasType objects:
>
>
> auto pi = Payload!int(5);
> auto pe = ParseError("error");
> alias PRType = ParseResult!(Payload!int, ParseError);
> auto pr = PRType(pi);
>
> gives:
>
> cannot implicitly convert expression `pi` of type `Payload!int` 
> to `SumType!(Payload!int, ParseError)`

Unfortunately, `alias this` does not apply to constructors. You 
can either add your own constructor to the wrapper struct:

struct ParseResult(Ts...)
{
     SumType!Ts data;
     alias data this;

     this(T)(T t)
         if (staticIndexOf!(T, data.Types) >= 0)
     {
         data = t;
     }
}

...or use a factory function like the following:

PRType parseResult(T)(T t)
{
     return PRType(SumType!(Payload!int, ParseError)(t));
}


More information about the Digitalmars-d-learn mailing list