1. 程式人生 > 其它 >decltype與函式指標,函式型別

decltype與函式指標,函式型別

昨天以為就剩下一點的內容了,以為會很快的看完,誰知道今天還是花了兩個小時才理解。

片段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。