2011-03-08 120 views
1

我想使用boost :: transform_iterator和boost :: bind來返回成員函數的結果。boost :: transform_iterator和boost :: bind

例如

class Foo 
{ 
public: 
//... 
Bar& getBar(); 
const Bar& getBar() const; 
}; 

我有一個一元函數對象來選擇getBar()函數

struct getBar: public std::unary_function<Foo&,Bar&> 
{ 
    getBar::result_type operator()(getBar::argument_type arg) const { 
    return arg.getBar() 
    } 
}; 

,並可以說,我已經儲存了多富一個std :: vector的內部對象,並使用我是個tranform_iterator像那

int main() 
{ 
    typedef std::vector<Foo> VEC; 
    typedef boost::transform_iterator<getBar,VEC::iterator> iterator; 
    VEC vec; 
    vec.push_back(Foo()); 
    iterator i(vec.begin()); 
    //... 
    Bar = *i; 
    return 0; 
}; 

但是,如果我想使用boost :: bind而不是getBar仿函數我會怎麼做。我不確定我必須將哪個模板參數傳遞給transform_iterator。

編輯:

與升壓::功能的解決方案是一個很好的開始,但我並不完全滿意,所以嘗試了一下,看着返回類型爲boost ::的

的mem_fn
typedef boost::transform_iterator<boost::_mfi::mf0<Bar&,Foo>,VEC::iterator> iter; 
typedef boost::transform_iterator<boost::_mfi::cmf0<const Bar&,Foo>,VEC::const_iterator> citer; 

但是這個解決方案有另一個問題 因爲

iter i(v.begin(), boost::mem_fn(&Foo::getBar)); 
citer ci(v.begin(), boost::mem_fn(&Foo::getBar)); 

導致以下錯誤

call of overloaded mem_fn(<unresolved overloaded function type>) is ambiguous 

編譯器無法識別哪個getBar功能要求,我必須幫助他一點點。

iter i(v.begin(), boost::mem_fn(static_cast<Bar& (Foo::*)()>(&Foo::getBar))); 
citer ci(v.begin(), boost::mem_fn(static_cast<const Bar& (Foo::*)() const >(&Foo::getBar))); 

這可能不會比手動編寫一個函數更快,但至少它幫助我更好地理解boost :: mem_fn。

回答

5
boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator> 
+0

可能是錯字?我認爲你的意思是'Bar&(Foo&)' – 2011-03-08 18:23:53

+0

@Ise:正確!謝謝; P – 2011-03-09 10:11:39

+1

太好了。但是在使用'boost :: function'時不會有性能損失? – 2011-03-09 10:19:33

相關問題