is(Type:Type) fails to evaluate to true

Silverclaw asdgfasd at fsadfa.com
Mon Oct 8 16:32:26 PDT 2007


silverclaw Wrote:

> Frits van Bommel Wrote:
> 
> > silverclaw wrote:
> > > I picked up the Matrix class I abandoned some months ago and updated it to the latest DMD (2.022). However, on the opMulAssign the following check fails where it should pass:
> > > 
> > > const Matrix!(Type) opMul(T)(const T multiplier)
> > > {
> > > 	static if (is(T:Matrix)) //multiplication by a Matrix
> > > 	{ (....) }
> > > 	else //multiplication by a scalar
> > > 	{ (....) }
> > > }
> > 
> > I assume this is a member of your Matrix template?
> 
> Yes. It's an operator overload, I wonder where else I'd put it <g> :P
> 
> > 
> > > It used to work on some other compiler version. So, on the main() I made the following code:
> > > 
> > > (static) if (is(Matrix:Matrix)) writefln("true");
> > > else writefln("false");
> > > 
> > > always evaluates to false (prints "false") with or without the "static". As you may have noticed, it is a template class:
> > > 
> > > public class Matrix(Type)
> > > 
> > > As I said, it used to work, I'm going to try to find out with which DMD. Any suggestions?
> > 
> > Are you sure it used to work like this?
> 
> Yes, I'm sure. I tried to make a template specialization but failing that, I asked in the webnews for a solution and that was the suggestion. As I said before I dropped this module a while ago. It worked at the time, still with a 1.x version of DMD. Anyway, the solution you suggested is what I'll end up doing anyway although I have no idea of what you meant by a "vtable" or in what way it is related to performance. I'll just put in a private empty interface on the module and use it for the comparison and be done with it.

Nope, that didn't do it. It still tries to compare the current inheritance level (Matrix!(Type)) and not it's superclass (BaseMatrix).



More information about the Digitalmars-d-learn mailing list