Why code failed to compile for foo2?

Steven Schveighoffer schveiguy at gmail.com
Mon Dec 13 20:43:51 UTC 2021


On 12/11/21 10:02 PM, apz28 wrote:
> On Sunday, 12 December 2021 at 00:02:25 UTC, Stanislav Blinov wrote:
>> @apz28, I can't figure out the intent here. To convert result of abs 
>> to an unsigned?
> 
> The function logic works only for unsigned type and the parameter value 
> can be altered in body hence Unqual. If not Unqual, must declare a local 
> var and make a copy. Just asking if this can be done to avoid a cast by 
> caller

To translate a bit here, what apz28 is looking for is, given ANY value 
type that implicitly converts from the qualified value to the 
unqualified value, generate *one* function that only accepts the 
unqualified value.

You can wrap like:

```d
void foo2(T)(T v) if (!is(Unqual!T == T))
{
    foo(Unqual!T(t));
}
```

This will inline as if you called it directly (which should just whittle 
down to a direct call to the correct foo2).

But D isn't currently smart enough to see through aliases, so IFTI will 
not work for what you are doing, even in a case like:

```d
template foo2(T) if (!isUnqual!T == T)
{
    alias foo2 = .foo2!(Unqual!T);
}
```

It would be nice if IFTI gave some hooks between the parameter and the 
deduction, but it currently doesn't.

-Steve


More information about the Digitalmars-d-learn mailing list