Facing problems with Class Properties

spir denis.spir at gmail.com
Fri Dec 10 23:51:21 PST 2010


On Sat, 11 Dec 2010 06:11:43 +0530
d coder <dlang.coder at gmail.com> wrote:

> > if(false) {
> >    for (size_t j = 0; j < f.length...)
> >    ...
> > }
> >
> > Semantically this code is wrong as you can't take the length of f which is class Bar. The static if forces the compiler to not generate this code as it is known to be false.
> >
> 
> Thanks Jesse
> 
> What you are saying makes sense to me. The problem is that the
> following code works perfectly. I have just commented out some part
> and replaced it with some debug statements.
> 
> The output from this code makes me believe that "is" and "typeof" do
> have some run-time semantics. Or is it a D2 bug. BTW I am using
> Digital Mars D Compiler v2.050.
> 
> Regards
> - Puneet
> 
> import std.stdio;
> class BaseClass { }
> 
> class Bar: BaseClass { }
> 
> class Foo: BaseClass {
>   this() {
>     foreach(i, f; this.tupleof) {
>       if (is (typeof(this.tupleof[i]) : BaseClass[])) {
> 	writeln("Creating new objects for all ARRAY types ", this.tupleof[i].stringof);
> 	// for (size_t j = 0; j < this.tupleof[i].length; ++j) {
> 	//   this.tupleof[i][j] = new typeof(this.tupleof[i][j]) ();
> 	// }
>       }
>       if (is(typeof(this.tupleof[i]) : BaseClass)) {
> 	writeln("Creating new objects for all NON-ARRAY types ",
> this.tupleof[i].stringof);
> 	// this.tupleof[i] = new typeof(this.tupleof[i]) ();
>       }
>     }
>   }
>   Bar instance1;
>   Bar instance2;
>   Bar [10] instances;
> }
> 
> unittest {
>   Foo foo;
>   foo = new Foo;
> }
> 
> // I am getting the following output
> // Creating new objects for all NON-ARRAY types this.instance1
> // Creating new objects for all NON-ARRAY types this.instance2
> // Creating new objects for all ARRAY types this.instances

Hello "d coder",


Maybe this is wrong and stupid, but I have faced several times similar cases ; meaning cases whare I perfectly knew (and D as well should have known ;-) that a given thing was of given type, but could not access its slots.
Try and downcast 'this.tupeof[i]' to the type that has a 'length'; if I'm right, you're done. (I find this wrong, buggy, & ugly, but well...) Else, sorry for the noise.

Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list