Printing shortest decimal form of floating point number with Mir

jmh530 john.michael.hall at gmail.com
Mon Jan 4 17:24:53 UTC 2021


On Monday, 4 January 2021 at 15:31:02 UTC, ag0aep6g wrote:
> On 04.01.21 16:03, jmh530 wrote:
>> IMO, this is a better example, even if it's a little more 
>> verbose.
>> 
>> struct Foo(T) {}
>> 
>> alias Bar(T) = Foo!T;
>> 
>> void f(T)(Bar!T x) {}
>> 
>> void main() {
>>      auto x = Bar!int();
>>      f(x);
>> }
>
> To be sure that I'm not missing anything: You just added the 
> temporary `x`, right? I don't think that changes anything. The 
> type of the argument is `Foo!int` in all variations of the code 
> we've seen, including this one. And that type is all that DMD 
> sees when it attempts IFTI of `f`.

Ah, I see your point above now (mixing up my Bar!ints and 
Bar!Ts). Yes, that was the only change and not really a 
substantive change (just my ease of reading).

Your point is basically that a template alias only becomes an 
actual alias when it has been instantiated. You then note that 
the deduction process operates in terms of Bar (in that you have 
to find a T that fits Bar!T to get to an alias of Foo!T). I think 
part of what is confusing is that the temporary x in my example 
is a Foo!int and not a Bar!int, which is why the Foo!int can't be 
passed into f(T)(Bar!T).

I think part of the issue is that many people's mental model 
would be for f(T)(Bar!T) to get re-writtn as f(T)(Foo!T), which 
is related to Ola's point with respect to type unification.

But the compiler isn't really doing any re-writing, so much as it 
sees the Foo!int and does not have the information necessary to 
determine that a Foo!int should satisfy Bar!T (as you point out). 
It would need to extract int from Foo!int, then instantiate Bar!T 
to get Foo!int (which I believe is what the implementation was 
doing, or something similar).



More information about the Digitalmars-d-announce mailing list