On Sat, 11 Dec 2010 06:11:43 +0530
d coder <dlang.co...@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

Reply via email to