Templates - Numeric Types only

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Aug 6 23:19:23 PDT 2009


Jarrett Billingsley wrote:
> On Fri, Aug 7, 2009 at 12:54 AM, Andrei
> Alexandrescu<SeeWebsiteForEmail at erdani.org> wrote:
>> Jarrett Billingsley wrote:
>>> On Thu, Aug 6, 2009 at 9:53 PM, Andrei
>>> Alexandrescu<SeeWebsiteForEmail at erdani.org> wrote:
>>>> Jarrett Billingsley wrote:
>>>>> On Thu, Aug 6, 2009 at 9:19 PM, Andrei
>>>>> Alexandrescu<SeeWebsiteForEmail at 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
>>>>>> 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?

Right now the compiler evaluates if clauses early in the matching 
process, eliminates those that are false, and "forgets" those that are 
true. It would be possible to make if-clauses an integral part of 
partial ordering by postulating that an instantiation originating from a 
matched if clause is more specialized than a template without an 
if-clause. That would interfere with the other partial ordering rules.

 >  Or, like so many other features in D, leave it half-specified,
 > half-useful, and half-implemented because "it got too hard"?

Which features of D are you referring to?


Andrei



More information about the Digitalmars-d mailing list