2010-03-10 98 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循环可以为你做出更小的努力。