Template argument deduction fails with alias

Paul Backus snarwin at gmail.com
Tue Sep 1 01:26:30 UTC 2020

On Tuesday, 1 September 2020 at 01:11:35 UTC, Ben Jones wrote:
> I have an alias that looks like
> static if(...){
>   alias AliasType = SumType!(...);
> }
> which I use in a template constraint for a function template:
> bool func(T: AliasType!Args, Args...)(T t){ ... }
> When I try to call func with an AliasType object, the argument 
> deduction fails with a message saying that the argument type (a 
> SumType) doesn't match the template constraint (an AliasType)
> Things do work if I change the template constraint to be a 
> SumType rather an an AliasType
> Is there a workaround to this?  Here's a complete example: 
> https://run.dlang.io/is/buRGTs

This is a very old known bug:


Attempts have been made to fix it, but the problem is a lot more 
complicated than it looks at first glance, so I wouldn't expect a 
solution any time soon.

Aside from using SumType directly in the function signature, 
another workaround is to use a wrapper struct instead of an alias:

     struct AliasType(Args...) {
         SumType!Args data;
         alias data this;

     bool func(T : AliasType!Args, Args...)(T t) { ... }

More information about the Digitalmars-d-learn mailing list