Templates - Numeric Types only

Jarrett Billingsley jarrett.billingsley at gmail.com
Thu Aug 6 22:19:30 PDT 2009


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



More information about the Digitalmars-d mailing list