2009-08-28 63 views
9

我有一個std :: vector,我想檢查每個元素的特定屬性 。 SomeStruct有一個屬性'type'。我想檢查此屬性 爲Type1或Type2。如何將boost :: lambda與std :: find_if一起使用?

我的計劃是使用boost :: lambda。

std::vector<SomeStruct>::const_iterator it = 
    std::find_if(
     vec.begin(), vec.end(), 
     _1.type == SomeStruct::Type1 || _1.type == SomeStruct::Type2); 

因爲我需要訪問每個元素的特定屬性,我不知道如果我能 使用boost ::拉姆達的。

任何提示?

回答

10
std::find_if(
    vec.begin(), vec.end(), 
    bind(&SomeStruct::type, _1) == SomeStruct::Type1 || 
    bind(&SomeStruct::type, _1) == SomeStruct::Type2); 
+0

這是完美的,但我無法理解它爲什麼有效。如果綁定(&SomeStruct :: func,_1)(func是一個函數),它也會以相同的方式工作,這會讓我更加困惑。 – yhager 2012-07-13 06:35:56

+0

@yhager'bind(&SomeStruct :: type,_1)'給你一個boost lambda,代表在'_1'是一個佔位符的對象上執行'.type'的結果。欲瞭解更多信息[請參閱綁定文檔](http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions)。 – sepp2k 2012-07-13 14:36:07

1

你表達不編譯因爲

_1.type 

點運算符不能重載讓你的表達不能作爲lambda表達式的工作,它只是指對象_1成員type定義於boost :: lambda.hpp。那麼,我不知道什麼是_1類型,思考這種類型會讓我感到不寒而慄 - 這不是我們的,凡人都知道的:-)。
正確的表達式由sepp2k給出。

+0

'_1'的類型是'boost :: lambda :: placeholder1_type'。 – sepp2k 2009-08-28 14:16:44

相關問題