Why a template with Nullable does not compile?
Victor Porton
porton at narod.ru
Tue Mar 12 16:23:29 UTC 2019
On Tuesday, 12 March 2019 at 16:20:11 UTC, H. S. Teoh wrote:
> On Tue, Mar 12, 2019 at 03:26:05PM +0000, Victor Porton via
> Digitalmars-d-learn wrote: [...]
>> On Tuesday, 12 March 2019 at 09:05:36 UTC, Nicholas Wilson
>> wrote:
> [...]
>> > template FieldInfo(T) {
>> > template FieldInfo(Nullable!(T) default_)
>> > {
>> > enum FieldInfo = 0;
>> > }
>> > }
>> >
>> > seems to work, but I can't seem to instantiate one of it.
>>
>> Why you use the same name "FieldInfo" for both the template
>> and its subtemplate? Does it make some sense?
>
> This is a D idiom called the "eponymous template". Whenever
> the template contains a member of the same name as the
> template, it's an eponymous template, and you can refer
> directly to the member by the template name, rather than using
> templateName.memberName.
>
> For example, a template function is usually written like this:
>
> ReturnType myFunc(TemplateArgs...)(RuntimeArgs args...)
> {
> ... // implementation here
> }
>
> This is actually shorthand for the eponymous template:
>
> template myFunc(TemplateArgs...)
> {
> ReturnType myFunc(RuntimeArgs args...)
> {
> ... // implementation here
> }
> }
>
> Similarly, when you write:
>
> enum isInputRange(T) = hasMember!(T, empty) && ...
>
> that's actually shorthand for:
>
> template isInputRange(T)
> {
> enum isInputRange = hasMember!(T, empty) && ...
> }
>
> The eponymonus template idiom allows you to use a single name
> to refer to both the template and the member. Without this
> idiom, you'd have to use the very verbose notation:
>
> static if (isInputRange!T.isInputRange) ...
>
> or
>
> auto retval = myFunc!(A, B, C).myFunc(1, 2, 3);
I know what is eponymous template. But how it behaves when the
eponymous member inside itself is also a template? How to
instantiate it? (provide please an example how to instantiate)
More information about the Digitalmars-d-learn
mailing list