在阅读一些代码时,我遇到了这个功能.我很难理解函数的签名.在我能够制作以下代码的头部或尾部之前,我需要了解哪些事情?我一直在使用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
这可能有助于清理一些事情:
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)