下面是通过扒代码缩减的最小function实现
template<typename _Ret, typename... _Types>
struct my_func_class
{
void* pun = 0;
_Ret operator()(_Types... cc) const
{
typedef _Ret(*pfnxx)(_Types...);
pfnxx fn = (pfnxx)(pun);
return fn(std::forward<_Types>(cc)...);//【2】
}
};
template<typename _Tx>//【1】
struct my_get_fun_impl;
template<typename _Ret, typename... _Types>
struct my_get_fun_impl<_Ret(_Types...)>
{
typedef my_func_class<_Ret, _Types...> mytype;
};
template<typename _Typ>
struct myfunction :
my_get_fun_impl<_Typ>::mytype
{
myfunction& operator=(void* ptrx)
{
pun = ptrx;
return *this;
}
myfunction(void* ptrx)
{
pun = ptrx;
}
};
}int add(int a, int b) { return a + b; } int _tmain(int argc, _TCHAR* argv[]) { myfunction<int(int, int)> afunc = nullptr; afunc = add; int c = afunc(1, 2);
(1)这个类在VS2008不能用(2)类似 templatename<int(int,int)> 样子的“int(int,int)” 模板参数表示一个函数的定义(函数指针定义中去掉那个*号)
(3)【1】这个定义很必要,可能是阻止编译器将int(int,int)当作一个参数,【1】下面的struct my_get_fun_impl<_Ret(_Types...)>具体化参数形式,并将其分解成返回值和参数表
(4)【2】处的forwad是C++11中的“完美转发”