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