#include<iostream>#include<string>usingnamespace std;classTest{public:Test(){}virtual~Test(){}};template<typename T>boolIsPtr(T* v)// match pointer{returntrue;}boolIsPtr(...)// match non-pointer{returnfalse;}intmain(int argc,char*argv[]){int i =0;int* p =&i;cout <<"p is a pointer: "<<IsPtr(p)<< endl;// truecout <<"i is a pointer: "<<IsPtr(i)<< endl;// falseTest t;Test* pt =&t;cout <<"pt is a pointer: "<<IsPtr(pt)<< endl;// truecout <<"t is a pointer: "<<IsPtr(t)<< endl;// false 運行時崩潰,變參無法處理對象的拷貝問題return0;}
上訴實現版本存在的缺陷:
變參函數無法解析對象參數,可能造成程序崩潰!
進一步的挑戰:
如何讓編譯器精確匹配函數,但不進行實際的調用?sizeof。
#include<iostream>#include<string>usingnamespace std;classTest{public:Test(){}virtual~Test(){}};template<typename T>charIsPtr(T* v)// match pointer{return'd';}intIsPtr(...)// match non-pointer{return0;}#define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))intmain(int argc,char*argv[]){int i =0;int* p =&i;cout <<"p is a pointer: "<<ISPTR(p)<< endl;// truecout <<"i is a pointer: "<<ISPTR(i)<< endl;// falseTest t;Test* pt =&t;cout <<"pt is a pointer: "<<ISPTR(pt)<< endl;// truecout <<"t is a pointer: "<<ISPTR(t)<< endl;// falsereturn0;}