function object研究之list1分析

2021-12-29 22:43:13 字數 2712 閱讀 6557

首先看一下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,內...