digitalmars.D.learn - foreach filter by cast
Is there a brief way to iterate an array of objects, and process
only objects of certain type (in either two ways, with/without
inheritance)?
foreach(p; obj.children){ // "KObj[] children"
DPFile dfile = cast(DPFile)p;
if(!dfile)continue;
...
}
I saw the std.algorithm.filter template helper could be used, but
it's a bit complex:
foreach(unit; file.children.filter!(a => cast(KUnit)a)){
...
}
Thanks
Feb 14 2015
I found a solution I like a lot, with templated opApply:
class Cont{
Thing[] kids;
int opApply(T)(int delegate(ref T) dg){
int result = 0;
for (int i = 0; i < kids.length; i++){
T t = cast(T)kids[i];
if(t){ result = dg(t);
if (result) break;
}
}
return result;
}
}
class Thing{
string name;
this(){ name = "thing";}
}
class TBan : Thing{
this(){ name = "tban";}
}
class TOne : Thing{
this(){ name = "tone";}
}
void main(){
Cont c = new Cont;
c.kids ~= new TBan;
c.kids ~= new TOne;
c.kids ~= new TOne;
c.kids ~= new Thing;
foreach(TOne k; c){ // the "TOne k" declares the filtering-type
writeln(k);
}
}
Feb 14 2015








"karl" <ultrano hotmail.com>