On Fri, Aug 7, 2009 at 12:54 AM, Andrei Alexandrescu<[email protected]> wrote: > Jarrett Billingsley wrote: >> >> On Thu, Aug 6, 2009 at 9:53 PM, Andrei >> Alexandrescu<[email protected]> wrote: >>> >>> Jarrett Billingsley wrote: >>>> >>>> On Thu, Aug 6, 2009 at 9:19 PM, Andrei >>>> Alexandrescu<[email protected]> 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 >>>>> >>>>> import std.traits; >>>>> >>>>> class Vector(T, int size = 4) if (isNumeric!T) >>>>> { >>>>> ... >>>>> } >>>> >>>> Unfortunately, >>>> >>>> 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) {} >>> 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.
So what's the solution? Integrate template conditions into the specialization rules? Use this as a justification for their behavior? Or, like so many other features in D, leave it half-specified, half-useful, and half-implemented because "it got too hard"?
