March 05, 2003 functions, delegates and templates | ||||
---|---|---|---|---|
| ||||
I have never used delegates in my life. Now I'm trying to start with D. I think this should be legal: template gen (T) { T max (T a,T b) { return (a>b?a:b); } bit comp(T a,T b,T delegate (T,T) f) { /*************/ return a==f(a,b); } } instance gen(int) intGen; instance gen(real) realGen; instance gen(char[]) strGen; void main() { int a=45,b=32; real c=-12.3,d=2.4; char[] e='hola',f='chao'; intGen.comp(a,b,intGen.max); realGen.comp(c,d,realGen.max); strGen.comp(e,f,strGen.max); } If I change delegate for function in the comp function, it doesn't work either. Both ways, I get non-matching arguments. Is the code correct or am I missing something? The workaround that I've tried was to declare as a function, and also declare 3 function pointers in main pointing to each max function, but I think there must be another way to do it. ------------------------- Carlos Santander --- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.459 / Virus Database: 258 - Release Date: 2003-02-25 |
March 05, 2003 Re: functions, delegates and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Carlos Santander B. | a delegate is an object and the method to call (unlike a C++ pointer to member func) try this template gen (T) { T max (T a,T b) { return (a>b?a:b); } class Maxer { T getmax( T a, T b ) { return max( a,b ); } } alias T (*compfunc)( T, T ); bit comp(T a,T b,compfunc f) { /*************/ return a==f(a,b); } alias T delegate( T, T ) compdel; bit comp(T a,T b, compdel f) { /*************/ return a==f(a,b); } } instance gen(int) intGen; instance gen(real) realGen; instance gen(char[]) strGen; int main( char[][] args ) { int a=45,b=32; real c=-12.3,d=2.4; char[] e='hola',f='chao'; intGen.comp(a,b, &intGen.max); realGen.comp(c,d, &realGen.max); strGen.comp(e,f, &strGen.max); intGen.comp(a,b, &(new intGen.Maxer).getmax ); realGen.comp(c,d,&(new realGen.Maxer).getmax ); strGen.comp(e,f, &(new strGen.Maxer).getmax ); return 0; } not unlike C/C++ you NEED the & to get a func ptr, or delegate intGen.max is int(int,int) not int(*)(int,int) "Carlos Santander B." <carlos8294@msn.com> wrote in message news:b45tmb$2c47$1@digitaldaemon.com... > I have never used delegates in my life. Now I'm trying to start with D. I think this should be legal: > > template gen (T) { > T max (T a,T b) { > return (a>b?a:b); > } > > bit comp(T a,T b,T delegate (T,T) f) { /*************/ > return a==f(a,b); > } > } > > instance gen(int) intGen; > instance gen(real) realGen; > instance gen(char[]) strGen; > > void main() { > int a=45,b=32; > real c=-12.3,d=2.4; > char[] e='hola',f='chao'; > > intGen.comp(a,b,intGen.max); > realGen.comp(c,d,realGen.max); > strGen.comp(e,f,strGen.max); > } > > If I change delegate for function in the comp function, it doesn't work either. Both ways, I get non-matching arguments. Is the code correct or am I > missing something? > The workaround that I've tried was to declare as a function, and also > declare 3 function pointers in main pointing to each max function, but I > think there must be another way to do it. > > > ------------------------- > Carlos Santander > > > --- > Outgoing mail is certified Virus Free. > Checked by AVG anti-virus system (http://www.grisoft.com). > Version: 6.0.459 / Virus Database: 258 - Release Date: 2003-02-25 > > |
Copyright © 1999-2021 by the D Language Foundation