2011-09-22 27 views
2

有人可以告訴我如何使用boost :: phoenix lambda實現以下等價物嗎? 我知道我可以在很多其他方面實現它,但我試圖學習Phoenix lambda表達式,到目前爲止,我在這個例子中的所有嘗試都失敗了。phoenix lambda和參數解引用

我想要做的就是使用std :: remove_if遍歷我的weak_ptrs集並刪除過期的。

因此,代碼會看起來像:

typedef std::set<weak_ptr<Xyz>> XyzWptrSetType; 
... 
XyzWptrSetType xyzWptrSet; 
... 
XyzWptrSetType::iterator it = 
    std::remove_if(xyzWptrSet.begin(), xyzWptrSet.end(), 
        (boost::phoenix::arg_names::_1->expied())); 
// the lambda part DOESN'T compile in previous line 
std::erase(it, xyzWptrSet.end()); 

大多數拉姆達的例子,我發現是非常簡單的,不與拉姆達參數調用對象的成員函數尤其是當有更多的處理而不是一個間接的層面。即_1預計代表集合的迭代器,通過解除引用「 - >」返回value_type(正在調用weak_ptr),我想調用它過期。但是因爲_1實際上是而不是是一個迭代器,而是一個「phoenix :: actor」,所以我的解引用不能編譯。

感謝所有的創意投入。

加布

+0

最後,我找到了一個非常相似的例子,並做了以下編譯的更改。 如果這是不正確的,請糾正此問題? 使用boost :: phoenix :: arg_names :: _ 1; XyzWptrSetType :: iterator it = std :: remove_if(xyzWptrSet.begin(),xyzWptrSet.end(), (&_1 - > *&weak_ptr :: expired)())); 還沒有測試過。 –

回答

2

Boost phoenix(和boost lambda)不支持 - >運算符。您可以使用「指向成員」運算符( - > *)作爲合理的選擇。

我發現它有用立即使用lambda表達式前行限定構件指針作爲一個單獨的變量:

bool (weak_ptr<Xyz>::*expired)()const = &weak_ptr<Xyz>::expired ; 
XyzWptrSetType::iterator it = 
    std::remove_if(xyzWptrSet.begin(), xyzWptrSet.end(), (&_1->*expired)()); 

正如其他人指出,這也是值得考慮像情況bind()的你的。

5

Boost.Phoenix,和之前Boost.Lambda它,擅長某些任務,而不是別人。其中一個並不真正起作用的其他類型與直接調用名稱函數有關。

Boost.Phoenix lambda可以快速輕鬆地爲重載運算符創建。但是如果你需要一個函數名,那麼你必須使用難看的語法:

boost::phoenix::bind(&boost::weak_ptr::expired, boost::phoenix::arg_names::_1) 

這就是你的lambda看起來像。您可以使用一些using指令來限制名稱空間,但這最終會是什麼樣子。這是從在這一點上使用boost::bind真的沒有什麼不同:

boost::bind(&boost::weak_ptr::expired, _1) 

Boost.Phoenix,和之前Boost.Lambda它,對於使用運算符重載,或明確定義的鳳凰行動的對象lambda表達式最好使用。如果你只有一個普通的舊函數或成員函數,你必須綁定它來調用它。所以你可以使用boost::bind