2010-03-10 101 views
9

我有一個指針向量。我想爲每個元素調用一個函數,但該函數需要引用。有沒有簡單的方法來解除元素的引用?使用for_each和boost :: bind指針向量

例子:

MyClass::ReferenceFn(Element & e) { ... } 

MyClass::PointerFn(Element * e) { ... } 

MyClass::Function() 
{ 
    std::vector< Element * > elements; 
    // add some elements... 

    // This works, as the argument is a pointer type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::PointerFn, boost::ref(*this), _1)); 

    // This fails (compiler error), as the argument is a reference type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 
} 

我可以創建一個骯髒的小包裝,需要一個指針,但我想必須有一個更好的辦法?

+0

你有使用'boost :: ref(* this)'的原因嗎?我只使用:boost :: bind(&MyClass :: ReferenceFn,this,_1),它工作正常。 – 2010-09-21 11:57:48

回答

15

你可以使用boost::indirect_iterator

std::for_each(boost::make_indirect_iterator(elements.begin()), 
       boost::make_indirect_iterator(elements.end()), 
       boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 

這將間接引用其operator*兩次改編的迭代器。

+4

+1,儘管在這種情況下,我更喜歡'BOOST_FOREACH(Element * e,elements)this-> ReferenceFn(* e);'。 C++可以作爲一種功能性語言使用,但不能作爲*簡明*功能語言...... – 2010-03-10 01:31:17

+0

而Python將在元素中用於e:self.ReferenceFn(e)'。這是令人心碎的。 – 2010-03-10 01:34:18

+4

對於C++ 0x,它將是for(auto * e:elements)ReferenceFn(* e);'。甜:) – 2010-03-10 01:54:15

3

它看起來像你也可以使用Boost.Lambda庫。

// Appears to compile with boost::lambda::bind 
    using namespace boost::lambda; 
    std::for_each(elements.begin(), elements.end(), 
        bind(&MyClass::ReferenceFn, boost::ref(*this), *_1)); 

但我同意關於寧願BOOST_FOREACH提意見。 「算法」幾乎沒有什麼用處,它的功能,基於範圍的for循環可以爲你做出更小的努力。