digitalmars.D.learn - Template overloading
- Bill Baxter (13/13) Nov 25 2007 Does anyone have a really good understanding of the dummy=void hack for
- Bruno Medeiros (20/37) Dec 05 2007 What do you mean "3 or more templates you need to differentiate"? Do you...
- Bill Baxter (14/59) Dec 05 2007 Ah, ok. Actually in the real code this was taken from there are integer...
Does anyone have a really good understanding of the dummy=void hack for making two templates with the same name but different arguments? Every time I try to use that I end up I just end up randomly adding in dummy=voids here and there till it works. Is there some rationale for where it should go (end of parameter list? beginning?)? And what about when you have 3 or more templates you need to differentiate? Also, am I right in thinking that if you pass any of the "real" template arguments explicitly then suddenly the dummy args must be passed too? Any advice on best practices in this area? My most recent run-in with this was trying to write a matrix multiply template that could take arguments of either Mat!(T),Mat!(T), or Mat!(T),Vec!(T). --bb
Nov 25 2007
Bill Baxter wrote:Does anyone have a really good understanding of the dummy=void hack for making two templates with the same name but different arguments? Every time I try to use that I end up I just end up randomly adding in dummy=voids here and there till it works. Is there some rationale for where it should go (end of parameter list? beginning?)? And what about when you have 3 or more templates you need to differentiate?What do you mean "3 or more templates you need to differentiate"? Do you remember this: http://d.puremagic.com/issues/show_bug.cgi?format=multiple&id=337 ?Also, am I right in thinking that if you pass any of the "real" template arguments explicitly then suddenly the dummy args must be passed too?Yes, the dummy hack only works implicitly for IFTI.Any advice on best practices in this area? My most recent run-in with this was trying to write a matrix multiply template that could take arguments of either Mat!(T),Mat!(T), or Mat!(T),Vec!(T). --bbWhat exactly are you trying to accomplish? This works: void mult2(T)(Mat!(T) a, Mat!(T) b) { pragma(msg, "Mat, Mat"); } void mult2(T)(Mat!(T) a, Vec!(T) b) { pragma(msg, "Mat, Vec"); } void main() { mult2(new Mat!(int), new Mat!(int)); mult2(new Mat!(int), new Vec!(int)); } But that seems too simple a solution, was that you were trying to do? -- Bruno Medeiros - MSc in CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
Dec 05 2007
Bruno Medeiros wrote:Bill Baxter wrote:Ah, ok. Actually in the real code this was taken from there are integer parameters that give the dimensions of the Mat and Vec. But DMD seems to have some issues with inference on integer parameters wrapped in a type, so I'm guessing that was probably why the straightforward solution didn't work. Actually the two should be: void mult2(T, int M, int N, int P)(Mat!(T,M,N) a, Mat!(T,N,P) b) { pragma(msg, "Mat, Mat"); } void mult2(T,int M, int N)(Mat!(T,M,N) a, Vec!(T,N) b) { pragma(msg, "Mat, Vec"); } --bbDoes anyone have a really good understanding of the dummy=void hack for making two templates with the same name but different arguments? Every time I try to use that I end up I just end up randomly adding in dummy=voids here and there till it works. Is there some rationale for where it should go (end of parameter list? beginning?)? And what about when you have 3 or more templates you need to differentiate?What do you mean "3 or more templates you need to differentiate"? Do you remember this: http://d.puremagic.com/issues/show_bug.cgi?format=multiple&id=337 ?Also, am I right in thinking that if you pass any of the "real" template arguments explicitly then suddenly the dummy args must be passed too?Yes, the dummy hack only works implicitly for IFTI.Any advice on best practices in this area? My most recent run-in with this was trying to write a matrix multiply template that could take arguments of either Mat!(T),Mat!(T), or Mat!(T),Vec!(T). --bbWhat exactly are you trying to accomplish? This works: void mult2(T)(Mat!(T) a, Mat!(T) b) { pragma(msg, "Mat, Mat"); } void mult2(T)(Mat!(T) a, Vec!(T) b) { pragma(msg, "Mat, Vec"); } void main() { mult2(new Mat!(int), new Mat!(int)); mult2(new Mat!(int), new Vec!(int)); } But that seems too simple a solution, was that you were trying to do?
Dec 05 2007