C++理解复杂函数签名

ibp*_*p73 5 c++

在阅读一些代码时,我遇到了这个功能.我很难理解函数的签名.在我能够制作以下代码的头部或尾部之前,我需要了解哪些事情?我一直在使用C++一段时间.我知道模板,函数指针是什么.但是,我无法弄清楚T::*可能意味着什么,从一开始就_Defer意味着语义.此外,该功能的第一行似乎非常令人生畏.在尝试重新评估此代码之前,是否有一些我可以阅读的资源?

template <typename T>
_Defer<void(*(PID<T>, void (T::*)(void)))
       (const PID<T>&, void (T::*)(void))>
defer(const PID<T>& pid, void (T::*method)(void))
{
  void (*dispatch)(const PID<T>&, void (T::*)(void)) =
    &process::template dispatch<T>;
  return std::tr1::bind(dispatch, pid, method);
}
Run Code Online (Sandbox Code Playgroud)

资料来源:https://github.com/3rdparty/libprocess/blob/master/include/process/defer.hpp

def*_*ube 5

这可能有助于清理一些事情:

template<typename T>
using VoidPMemberFn = void(T::*)(); // Pointer to member function of T
                                    // that accepts no arguments and
                                    // returns nothing.

template<typename T>
using DeferResultType = void (*)(const PID<T> &, VoidPMemberFn<T>);

template<typename T>
using DeferSignatureType = DeferResultType<T>(PID<T>, VoidPMemberFn<T>);

template<typename T>
_Defer<DeferSignatureType<T>> defer(const PID<T> &pid, VoidPMemberFn<T> method)
{
    // Stuff...
}
Run Code Online (Sandbox Code Playgroud)

编辑

这可能有助于澄清_Defer模板中意大利面的含义,以及它与上述内容的关系:

void(* (PID<T>, void (T::*)(void)) )(const PID<T>&, void (T::*)(void))
^-+^-^ ^-------------------------^  ^-------------+------------------^
  |           argument list                       |
  |                                               |
  +-----------------------------------------------+
              return type:  void(*)(const PID<T> &, void(T::*)(void))
Run Code Online (Sandbox Code Playgroud)

这会创建一个"签名",就像那些std::function(例如std::function<int(float)>)一样.

更多例子:

using sig = int(float);

sig gn; // Same as: "int gn(float)", a function declaration

int fn(float x)
{return (int)x;}

int main(int argc, char **argv)
{
    // pointer to a function with signature "sig"
    sig *pfn = &fn;
    return 0;
}

int gn(float x)
{return (int)(x*x);}
Run Code Online (Sandbox Code Playgroud)