2011-07-10 67 views
3

我有這樣的結構。作爲謂詞的成員函數比較

struct A 
{ 
    int someFun() const; 
    int _value; 
}; 

我將此結構的對象存儲在一個向量中。

  1. 如何找到其成員someFun()回報42對象?

  2. 如何找到_value42的對象?

我想我必須使用的bindequal_to的組合,但我無法找到正確的語法。

vector<A> va; 
vector<A>::const_iterator val = find_if(va.begin(),va.end(),boost::bind(???,42)); 

編輯:

感謝。但還有一個疑問。

如果我有vector<A*>vector<boost::shared_ptr<A> >怎麼辦?

+0

你有C++ 0x嗎?拉姆達將是最可讀的解決方案。 –

+0

@Kerrek Nope。 :( – balki

+0

使用Boost.Lambda或Boost.Phoenix。或者只是定義一個函數/函子。 – kennytm

回答

4
vector<A> va; 

vector<A>::const_iterator v0 = find_if(
    va.begin() 
    , va.end() 
    , boost::bind(&A::someFun, _1) == 42); 

vector<A>::const_iterator v1 = find_if(
    va.begin() 
    , va.end() 
    , boost::bind(&A::_value, _1) == 42); 

如果你需要編寫綁定表達式(如使用不能與boost::bind支持的運營商表達了functor):

vector<A>::const_iterator v1 = find_if(
    va.begin() 
    , va.end() 
    , boost::bind(functor(), boost::bind(&A::someFun, _1), 42)); 

導致調用functor::operator()與參數如下:調用綁定表達式的參數上的成員的結果,和42.

+0

'錯誤:'boost :: bind [with R = int,T = A,A1 = boost :: arg <1>](&A :: someFun,( :: _ 1,boost :: arg <1>()))== 42'' – balki

+0

@balki什麼版本的Boost? –

+0

BOOST_LIB_VERSION是我的系統中的1_32。 我也嘗試過ideone,但給出了一個不同的錯誤http://ideone.com/bnk z6 – balki