2015-09-14 202 views
2

在一些C++ 98代碼(使用std::function不是一個選項意味着沒有,),我發現了下面的結構:傳遞隱函數指針

class someClass 
{ 
public: 
    typedef void callback(); 

    void setCallback(callback c) 
    { 
     mCallback = c; 
    } 

    void callCallback() 
    { 
     if (mCallback) 
      mCallback(); 
    } 
private: 
    callback *mCallback; 
}; 

這種困惑我。我習慣於將回調函數作爲函數指針傳遞,所以我期望setCallback(*callback)()作爲參數。

但是,上面的代碼似乎工作,並編譯沒有任何(相關)的警告。

有人能告訴我這裏發生了什麼嗎?我的回調函數是否作爲函數指針隱式傳遞?使用它而不是函數指針是個好主意嗎?

我唯一能找到的就是這個結構導致了「參數聲明子句」的模糊性(C++ 98 8.3p7)。這是唯一的缺點嗎?有什麼好處嗎?

+0

函數類型調整爲參數聲明中函數類型的指針 –

+2

當函數類型被用作函數參數類型時,它被調整爲指針函數類型,所以'setCallback'可以同樣被調用聲明爲'void setCallback(callback * c)'。 (函數類型和數組類型在本文和相關方面非常相似。) –

+0

在規範中是否有任何對此的引用?據我所知,這在C中不存在... – Bitbored

回答

0

與數組類似,函數類型的參數實際上聲明瞭該類型的指針。