2015-09-14 153 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

与数组类似,函数类型的参数实际上声明了该类型的指针。