stl模板编程模板参数推导

之前一直未仔細看STL中的一些源碼,每次看都覺得頭疼,因為感覺裏面的很多句子都晦澀難懂,最近在看boost,感覺還是得知難而進,不然看不下去。

關於主題,首先看STL中的一個函數std::mem_fun_ref

完整代碼為

template<class _Result,
	class _Ty> inline
	mem_fun_ref_t<_Result, _Ty> mem_fun_ref(_Result (_Ty::*_Pm)())
	{	// return a mem_fun_ref_t functor adapter
	return (std::mem_fun_ref_t<_Result, _Ty>(_Pm));
	}

在这里,假设我们定义一个类为CTest,CTest裏面有一個返回值為myretType的FUN,再定义一个该类对象ctestobj,則我们使用std::mem_fun_ref一般的形式是:std::mem_fun_ref(&CTest::FUN)(ctestobj)。

從以上使用的形式可以看出,雖然std::mem_fun_ref是一個模板函數,但我們并沒有(顯式的)指出該函數使用了那個具體類型,但是編譯還是可以通過且可以運行。原因是,編譯器可以根據傳遞過來的函數在編譯階段推導出模板函數所需要的類型信息。

在這裡,_Result推導為myretType,_Ty推導為CTest,_Pm則是成員函數FUN。所以即使你沒有指出模板的具體類型,編譯器從你寫的代碼中獲得了足夠的信息進行編譯(特別注意的是函數的返回值也作為了一個推導依據,即函數返回值也可以使泛型 ~ C++語法真是博大精深 ~ )。


其中使用了的std::mem_fun_ref_t是一個函數對象(仿函數),源碼為

template<class _Result,
	class _Ty>
	class mem_fun_ref_t
		: public unary_function<_Ty, _Result>
	{	// functor adapter (*left.*pfunc)(), non-const *pfunc
public:
	explicit mem_fun_ref_t(_Result (_Ty::*_Pm)())
		: _Pmemfun(_Pm)
		{	// construct from pointer
		}

	_Result operator()(_Ty& _Left) const
		{	// call function
		return ((_Left.*_Pmemfun)());
		}

private:
	_Result (_Ty::*_Pmemfun)();	// the member function pointer
	};

此段代碼理解起來也不難(但要真正自己寫,還是有難度的^_^),與本主題無關,就不解釋了。

簡單起見,自己寫了一段相對於標準庫中簡單很多的測試代碼,有助於理解

template<class _return_type>
_return_type returnTypeIsATemplateFn(_return_type fn )
{
	return fn;
}

int fnnnn(int x, int y)
{
	return x + y;
}

void TemplateGrammTest()
{
	cout<<returnTypeIsATemplateFn(fnnnn(1, 2))<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值