我有一个指针向量。我想为每个元素调用一个函数,但该函数需要引用。是否有一种简单的方法来取消引用元素?
示例:
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 :(得分: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*
中两次取消引用适应的迭代器。
答案 1 :(得分: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
“算法”几乎没有任何用处,它的作用是基于范围的循环可以为你做更少的努力。