On Sunday, 23 December 2018 at 12:09:31 UTC, Michelle Long wrote:
class X
{

}

class X(int N) : X
{

}

Is there any real reason we can't do this?

It is very nice to be able to treat X like the base and X!n as a derived class.

Sure we can do

class X(int N) : X!0
{
   static if(N == 0)
   {
   }
}

but this is very ugly, in my code I always have to use X!0 as the basis!

I do not think there is any harm to allow this since the templated class always has to specify N. It is not like we can do

class X(int N = 0) : X
{
   static if(N == 0)
   {
   }
}


Actually we can, so... I don't see the point in not allowing the first case, they are logically equivalent. That static if is just ugly and it is defining the base class inside the derived class which seems unnatural.

You have this option too:

```
template X(N...)
if (N.length == 0 ||
    N.length == 1 && is(typeof(N[0]) == int))
{
    static if (N.length == 0)
    class X {}

    else class X : X!() {}
}

auto base = new X!();
auto derived = new X!8;
```

More simple is : do not use the same identifier ;)

Reply via email to