9

我有一个指针向量。我想为每个元素调用一个函数,但该函数需要一个引用。有没有一种简单的方法来取消引用元素?

例子:

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 ) );
}

我可以创建一个带有指针的脏小包装器,但我认为必须有更好的方法?

4

2 回答 2

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*.

于 2010-03-10T01:05:47.847 回答
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_each算法”实际上没有任何用处,而它所做的,基于范围的 for 循环可以为您做更少的工作。

于 2010-03-10T08:18:49.673 回答