C泛型指针与共用体对泛型编程的模拟
C用模板来实现泛型,C没有模板,但通过void指针可以一定程度上模拟泛型,特别是在库函数中用做函数参数或函数返回值,如memmove()、qsort()等。
以下是一个用void做函数参数的小demo:includestdio。henumTYPE{CHAR,INT,DOUBLE};voidprint(voidp,enumTYPEt){switch(t){caseCHAR:printf(c,(char)p);break;caseINT:printf(d,(int)p);break;caseDOUBLE:printf(0。22lf,(double)p);break;default:printf(error:unknowntype);}}intmain(){charcha;print(ch,CHAR);intn12;print(n,INT);doubled0。12345678901234567890123;print(d,DOUBLE);getchar();return0;}a120。1234567890123456800000
也可以用共用体来同等实现:includestdio。htypedefstructDatatype{enum{character,integer,floatingpoint}vartype;union{charc;inti;doublef;};}datatype;voidprint(datatypedt){switch(dtvartype){casecharacter:printf(charactertype:c,dtc);break;caseinteger:printf(integertype:d,dti);break;casefloatingpoint:printf(floatingpointtype:f,dtf);break;}}intmain(){datatypea;a。vartypecharacter;a。cc;print(a);datatypeb;b。vartypeinteger;b。i2;print(b);datatypec;c。vartypefloatingpoint;c。f3。14;print(c);getchar();return0;}charactertype:cintegertype:2floatingpointtype:3。140000
用C的类就优雅多了:includeiostreamusingnamespacestd;classdatatype{enum{character,integer,floatingpoint}vartype;union{charc;inti;doublef;};public:datatype(charch){vartypecharacter;cch;}datatype(intii){vartypeinteger;iii;}datatype(doubled){vartypefloatingpoint;fd;}voidprint();};voiddatatype::print(){switch(vartype){casecharacter:coutcharactertype:cendl;break;caseinteger:coutintegertype:iendl;break;casefloatingpoint:coutfloatingpointtype:fendl;break;}}intmain(){datatypea(c),b(16),c(3。14);a。print();b。print();c。print();getchar();return0;}
当然,C的模板来得更简洁:includeiostreamtemplatetypenameTTvoidprint(TTdata){std::coutdatastd::endl;}intmain(){charcha;print(ch);intn12;print(n);doubled3。14;print(d);getchar();return0;}
End