## digitalmars.D - Re: Templates - Numeric Types only

```Andrei Alexandrescu Wrote:

Jarrett Billingsley wrote:
On Thu, Aug 6, 2009 at 9:53 PM, Andrei
Alexandrescu<SeeWebsiteForEmail erdani.org> wrote:
Jarrett Billingsley wrote:
On Thu, Aug 6, 2009 at 9:19 PM, Andrei
Alexandrescu<SeeWebsiteForEmail erdani.org> wrote:
Kevin wrote:
Hi,
simple Question:
Is it possible to allow just numeric types in templates?
For example to create a Vector Class like this:

class Vector(T:"numeric" = float, int size = 4)

Thanks,
Kevin

class Vector(T, int size = 4) if (isNumeric!T)
{
...
}

struct Vec(T) if(isNumeric!T) {}
struct Vec(T) {}
Vec!(int) x; // error

foo.d(14): Error: template instance Vec!(int) matches more than one
template declaration, Vec(T) if (isNumeric!(T)) and Vec(T)

*sigh*

Wouldn't it be nice.

struct Vec(T) if(!isNumeric!T) {}

is actually superior because it's more modular; the semantics of the latter
does not depend on the presence of the former.

But the condition of the latter now depends on the condition of the
former.  And on the condition of any other 'specializations':

struct Vec(T) if(isNumeric!T) {}
struct Vec(T) if(isSomeString!T) {}
struct Vec(T) if(!isNumeric!T) {} // uhoh
Vec!(string) x; // matches two

Now the fallback has to be declared as

struct Vec(T) if(!isNumeric!T && !isSomeString!T) {}

and it gets worse the more you add.

I know, and I explained why that's arguably better.

Andrei

I for myself favor lots of small templates to keep function declarations
shorter, for example:

template isStringOrNumeric(T) {
enum isStringOrNumeric = isSomeString!T || isNumeric!T;
}
struct Vec(T) if(isSomeString!T) {}
struct Vec(T) if(isNumeric!T) {}
struct Vec(T) if(!isStringOrNumeric!T) {}

It also allows for the templates to have static asserts of their own to make
bugs easier to isolate, and they can be moved to another file which makes for
more generic programming. Chances are you'll be using the template again if you
need it here.

I usually try to keep my template if statements down to one or two short
expressions at most, otherwise it quickly becomes more confusing than useful.
```
Aug 07 2009