关于C++11中function的一点点分析

下面是通过扒代码缩减的最小function实现


template
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//【1】
struct my_get_fun_impl;

template
struct my_get_fun_impl<_Ret(_Types...)>
{
	typedef my_func_class<_Ret, _Types...> mytype;
};

template
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 afunc = nullptr;
	afunc = add;
	int c = afunc(1, 2);
}

 
  





(1)这个类在VS2008不能用

(2)类似 templatename 样子的“int(int,int)” 模板参数表示一个函数的定义(函数指针定义中去掉那个*号)

(3)【1】这个定义很必要,可能是阻止编译器将int(int,int)当作一个参数,【1】下面的struct my_get_fun_impl<_Ret(_Types...)>具体化参数形式,并将其分解成返回值和参数表

(4)【2】处的forwad是C++11中的“完美转发”




你可能感兴趣的:(C语言)