On 5/15/20 8:04 AM, Paul Backus wrote:
On Friday, 15 May 2020 at 14:55:07 UTC, Ali Çehreli wrote:
Additionally, the name of a template when used inside that template means that instance of it. So just say Foo. :)

struct Foo(A, B, C, size_t a, size_t b)
{
  Foo * p;
}

Ali

To expand a little, this works because a struct template such as the one above is actually syntax sugar for the following:

template Foo(A, B, C, size_t a, size_t b)
{
     struct Foo
     {
         // refers to the inner `struct Foo`, not the outer `template Foo`
         Foo* p;
     }
}

The relevant parts of the language spec are:

- Aggregate Templates: https://dlang.org/spec/template.html#aggregate_templates - Eponymous Templates: https://dlang.org/spec/template.html#implicit_template_properties
Yes, that is a consistent way of explaining it. :)

As an off-topic trivia, the same feature is in C++ as well:

#include <iostream>

template <class A, class B, class C, size_t a, size_t b>
struct Foo
{
  Foo * p;  // <-- Foo means the template instance
};

int main() {
  Foo<int, double, long, 10, 20> f;
  f.p = &f;
}

Ali

Reply via email to