First Draft: Implicit Type Template Instantiation via Constructors
Meta
jared771 at gmail.com
Wed May 14 17:59:22 UTC 2025
On Wednesday, 14 May 2025 at 16:41:44 UTC, Sebastiaan Koppe wrote:
> On Wednesday, 14 May 2025 at 06:46:09 UTC, Meta wrote:
>> On Tuesday, 13 May 2025 at 06:06:54 UTC, Sebastiaan Koppe
>> wrote:
>>> On Wednesday, 12 March 2025 at 00:20:55 UTC, Meta wrote:
>>>> This DIP is a partial resurrection of DIP 40
>>>> (https://wiki.dlang.org/DIP40) by me and Dennis Korpel.
>>>> Dennis is working on the implementation
>>>> (https://github.com/dlang/dmd/pull/16910) while I am writing
>>>> the DIP.
>>>>
>>>> The purpose of this DIP is to propose a new avenue for
>>>> Implicit Template Instantiation (ITI) via constructors.
>>>> Currently (that I'm aware of) D only does Implicit
>>>> _Function_ Template Instantiation (IFTI); the proposal is to
>>>> extend this implicit instantiation to types as well, via
>>>> their constructors.
>>>>
>>>> [...]
>>>>
>>>> The DIP:
>>>> https://github.com/MetaLang/DIPs/blob/dip1050/DIPs/DIP1050.md
>>>
>>> Makes a lot of sense to me.
>>>
>>> What about implicit constructors though?
>>>
>>> ```
>>> struct Pair(T,U) {
>>> T t;
>>> U u;
>>> }
>>> void main() {
>>> auto p = Pair(1,"string");
>>> }
>>> ```
>>
>> That is not actually a constructor - it is struct literal
>> syntax. I did not realize there was a difference either until
>> recently.
>
> Fair enough, but could the dip support it, or perhaps in the
> future? The fact that we both expected it was a constructor -
> and you could argue it actually is, on the grounds that it does
> in fact construct an object - suggests more users would expect
> it to work.
I was going to say that this is not possible without at least 1
defined constructor due to how the implementation works. However,
look at step 5 of the algorithm in the DIP:
```
5. If a matching constructor is found (in this case, this(T t, U
u), create a new constructor this(T, U)(T t, U u) and try IFTI
with that.
```
If it's creating a new constructor anyway to be instantiated, it
could probably do this for structs even when there are no
explicit constructors defined... I'll see what Dennis thinks want
this and whether it's worth doing, because it *should* be very
simple to add.
More information about the dip.development
mailing list