decltype與函式指標,函式型別
阿新 • • 發佈:2022-04-09
昨天以為就剩下一點的內容了,以為會很快的看完,誰知道今天還是花了兩個小時才理解。
片段1:
int fun1(int a, int b) {
return 32;
}
int fun2(int, int) {
return 68;
}
int fun2(int, int);
decltype(fun1) *name(const string &) {
return fun1;
}
主要是 decltype 的問題,如果是
decltype(fun1(5,6)) name ;
//等價於 int name;
這種型別的,那麼name是fun1函式的返回值型別,也就是int 型別。
但是如果是片段1的型別,那麼decltype(fun1) 返回的是函式型別。
例如
decltype(fun1) name;
所謂的函式型別就是為函式起了個別名。我可以使用 name(4,6) 來呼叫fun1。
那麼如何需要返回函式指標型別呢?
decltype (fun1) *name;
name =fun1;
name(45,89);
//也可以
name=fun2;
函式指標的靈活性是函式型別不能比擬的,但是要注意,指標指向的函式的引數型別必須是一直的,因為fun1與fun2都是兩個int型別的,所以name既可以指向fun1,也可以指向fun2。
那麼程式碼中的
decltype(fun1) *name(const string &) { return fun1; }
是什麼意思呢?
我認為這裡的 name 是一個函式名稱,返回值為 decltype(fun1)* ,也就是一個指向函式的指標。
name函式的引數是一個string引用,返回值是一個指向函式的指標,我們就return fun1就好了。這個程式本來的目的是根據形參 string& 來決定呼叫 fun1還是fun2。比如如果 string的長度大於4,我們就呼叫fun1,否則就呼叫fun2。