Giant template - changing types everywhere
Christian Köstlin
christian.koestlin at gmail.com
Fri Jul 14 16:40:31 UTC 2023
On 14.07.23 16:15, Steven Schveighoffer wrote:
> On 7/14/23 1:51 AM, Cecil Ward wrote:
>> On Friday, 14 July 2023 at 05:09:58 UTC, Cecil Ward wrote:
>>> On Friday, 14 July 2023 at 05:05:27 UTC, Cecil Ward wrote:
>>>> On Friday, 14 July 2023 at 05:03:31 UTC, Cecil Ward wrote:
>>>>>
>>>>> The way I can see it going is a giant template encompassing pretty
>>>>> much the whole file. Does that mean that the caller who calls my
>>>>> one public function does so by passing the type dchar or wchar ?
>>>>> And then we generate the strings from that. It might be rather more
>>>>> natural for the caller to pass one of the string types into the
>>>>> template. That’s where I get rather more confused, say caller calls
>>>>>
>>>>> Transform(dstring)(dstring str)
>>>>>
>>>>> or can they just do Transform( "str"d ) and it would work out that
>>>>> the type is immutable dchar[] ?
>>>>
>>>> Perhaps I should just make up a small example file with two
>>>> functions in it to see if I can get the syntax right?
>>>
>>> If I wrap the whole thing with a template declaration of the xchar
>>> type, then can I get away with no changes to the individual function
>>> definitions?
>>
>> I tried it, wrapped the whole thing in a template definition and it
>> compiled, but then my test file which calls Transform( someDString )
>> failed to compile with errors saying it couldn’t find the definition
>> of Transform in the other module, which is or was public. It’s as if
>> it is no longer public because it’s now inside the template.
>
> So templates don't automatically instantiate, you have to specify them.
> And then if your function is inside the template, to access it, you will
> need to do:
>
> ```d
> GiantTemplate!dstring.Transform(str);
> ```
>
> But this is not a usual way of creating API. Instead, you should
> template individual functions on the string type.
>
> Depending on what you are doing, you can use:
>
> ```d
> T Transform(T)(T val)
> T[] Transform(T)(T[] val)
> ```
>
> The first will cover cases where you have custom string types that
> aren't arrays, the second will just capture the array type, and ensures
> that the parameter/return is an array.
>
> When you make template functions like this, a feature of D called
> Implicit Function Template Instantiation (IFTI) will automatically
> instantiate the template for you, so you don't have to specify the
> template parameters.
>
> You just call `Transform(str)` and it works. With the wrapping template
> solution, this is not available -- you must explicitly instantiate the
> wrapper.
>
> If you are having problems, it is nearly impossible to diagnose without
> some actual code to look at.
>
> -Steve
Would Eponymous Templates
(https://dlang.org/spec/template.html#implicit_template_properties) work
with the wrapping template?
Kind regards,
Christian
More information about the Digitalmars-d-learn
mailing list