On Thu, 01 Sep 2011 13:59:29 +0200, Timon Gehr wrote: > static assert(isInputRange!Test); > static assert(isInputRange!Test2); > > toString is not shadowed, but the implementation of writeln assumes that > your types are an InputRange (they provide, by the means of opDispatch, > front(), empty() and popFront()) > > The fact that writeln([]); prints a new line instead of "[]" is a bug > that has already been taken care of in a pull request afaik. > > This specific problem can be solved by making your types not follow the > InputRange interface, by putting an appropriate constraint on your > opDispatch. > > > import std.stdio; > > struct Test > { > string opDispatch( string key )() if(key!="popFront") { > return "I am dispatching in struct!"; > } > > string toString() > { > return "I am Test struct!"; > } > } > > class Test2 > { > string opDispatch( string key )() if(key!="popFront") { > return "I am dispatching in class!"; > } > > string toString() > { > return "I am Test class!"; > } > } > > void main() > { > Test test = Test(); > writeln ( test.s ); // I am dispatching in struct! writeln ( test.s() > ); // I am dispatching in struct! writeln ( test ); //I am Test struct! > > Test2 test2 = new Test2(); > writeln ( test2.s ); // I am dispatching in class! writeln ( test2.s() > ); // I am dispatching in class! writeln ( test2 ); // I am Test class! > }
Yes, this fix the problem. Hmm, after all its a bit loose of a keyword, becouse I can't use anymore test.popFront. For example if class acts as a storage device class Storage { string[ string ] vars; string opDispatch( string key )() if ( key != "popFront" ) { if ( key in vars ) return vars[ key ]; else return ""; } string toString() { // implement me } } auto storage = new Storage; storage.vars["test"] = "I'm a test!"; storage.vars["popFront"] = "I'm a poping around! :D"; writeln( storage.test ); // I'm a test! writeln( storage.popFront ); // error Ofcours, in opDispatch I can use empty or front instead of popFront but it is still loose of one keyword. Looks like it's a loose I have to take :-) Thank you very much for reply! Best regards, Damian Ziemba