您的位置:首页 > 编程语言

stl模板编程模板参数推导

2012-05-31 10:25 288 查看
之前一直未仔細看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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: