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

下面是通过扒代码缩减的最小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中的“完美转发”




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值