stl模板编程模板参数推导
2012-05-31 10:25
288 查看
之前一直未仔細看STL中的一些源碼,每次看都覺得頭疼,因為感覺裏面的很多句子都晦澀難懂,最近在看boost,感覺還是得知難而進,不然看不下去。
關於主題,首先看STL中的一個函數std::mem_fun_ref
完整代碼為
在这里,假设我们定义一个类为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是一個函數對象(仿函數),源碼為
此段代碼理解起來也不難(但要真正自己寫,還是有難度的^_^),與本主題無關,就不解釋了。
簡單起見,自己寫了一段相對於標準庫中簡單很多的測試代碼,有助於理解
關於主題,首先看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; }
相关文章推荐
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。
- 2013-04-21 STL之模板编程技巧
- C++类模板与STL编程
- STL中,traits编程技法+模板
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。+string +dfs +bfs等重要算法
- 简介Python设计模式中的代理模式与模板方法模式编程
- 实现编程时Vim自动导入相应模板
- 32位汇编编程模板--使用masm6.15环境
- VS2010/MFC编程入门之五(对话框:创建对话框模板和修改对话框属性)
- 模板编程
- C++ STL编程轻松入门
- C++ 标准模板库(STL)编程示例 - multimap
- STL三:Traits编程技法一
- Linux input子系统编程、分析与模板
- 【STL常用模板】
- C++STL模板容器(三)
- C++ STL编程轻松入门(1)
- k-means算法使用C++ STL模板
- 笨鸟先飞学编程系列之九-C++的模板编程
- STL与泛型编程(1)---模板