首先看一下bind.hpp中的list0模板定義:
[cpp]
class list0
template t & operator (_bi::value & v) const
template t const & operator (_bi::value const & v) const
template t & operator (reference_wrapper const & v) const
template typename result_traits::type operator (bind_t & b) const
template typename result_traits::type operator (bind_t const & b) const
template r operator()(type, f & f, a &, long)
template r operator()(type, f const & f, a &, long) const
template void operator()(type, f & f, a &, int)
template void operator()(type, f const & f, a &, int) const
template void accept(v &) const
bool operator==(list0 const &) const
}; 提供了accept方法接受v&,但是什麼實現也沒有。提供了一堆operator過載函式,重點關注operator()()的函式,說明其實list0就是乙個function object。
1.type是什麼?定義如下:
[cpp] www.2cto.com
template class type {};
只是乙個普通模板,接受任何型別。
2.unwrap(f,0)的結果是返回f, 因此如果f是以乙個函式傳遞給了operator()(type, f& f, a&, long) ,則內部的unwrap(f,0)返回的是f
因此實際上**被編譯成了直接呼叫f的**:f()
這是個很好的讓編譯器在編譯期產生呼叫函式**的技巧。
因此功能比較強大。
3.實際上f函式執行的時候傳遞進來的引數這裡是空,下面就能看到有乙個引數的例子。
繼續看list1的定義:
template< class a1 > class list1: private storage1< a1 >
a1 operator (boost::arg<1>) const
a1 operator (boost::arg<1> (*) ()) const
template t & operator ( _bi::value & v ) const
template t const & operator ( _bi::value const & v ) const
template t & operator (reference_wrapper const & v) const
template typename result_traits::type operator (bind_t & b) const
template typename result_traits::type operator (bind_t const & b) const
template r operator()(type, f & f, a & a, long)
template r operator()(type, f const & f, a & a, long) const
template void operator()(type, f & f, a & a, int)
template void operator()(type, f const & f, a & a, int) const
template void accept(v & v) const
bool operator==(list1 const & rhs) const
}; 看到很多老朋友了吧?
1.從storage1繼承,
因此也就擁有了a1_, 這裡有點不明白,為什麼偏特化版本的storag1沒有定義a1_,只有a1()靜態函式,居然這裡就有了。下面的**編譯通過。
[cpp]
boost::_bi::storage1<:arg> > x(_1);
x.a1_;
2. 幾個operator() 函式有點意思,用_1作為下標,呼叫的是第乙個過載:
[cpp]
list[_1];
-->
a1 operator (boost::arg<1>) const
3.operator()()函式的引數a & a實際上也是乙個list1物件,並且裡面的a_成員就是外部實際呼叫的引數。
a[base_type::a1_] 這句**要注意:
通過this物件的base_type::a1_,這時候a1_是指標函式,返回佔位符boost::arg<1> 。
用a1_來作為引數,傳遞給a物件的operator(boost::arg<1> (*)() 方法來獲取內部儲存的實際引數。
a物件和this物件都是乙個從模板list1<>演化而來,但是不是同乙個物件。
4.其他的函式都比較簡單, accept以前也介紹過,visitor模式的實現。
function object研究之一
function object首先是乙個類,它實現了函式呼叫操作符t operator t t可以是void型別。class a void operator int x cout x 0通過檢視for each的源 可以觀察到stl中使用function object的基本特徵。下面是gcc4.6....
function object研究之一
function object首先是乙個類,它實現了函式呼叫操作符t operator t t可以是void型別。class a void operator int x cout x 0通過檢視for each的源 可以觀察到stl中使用function object的基本特徵。下面是gcc4.6....
function object研究之四
在前面介紹了function object是stl演算法的主要使用方式。如果能將現有的函式指標,函式,成員函式等等都封裝成function object,就可以獲得stl演算法的支援,而且可以減少專門編寫function object的工作量。基本思路仍然是構造乙個function object,內...