Jarrett Billingsley wrote:
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?
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