boost :: transform_iterator和boost :: bind

时间:2011-03-08 16:28:06

标签: c++ boost iterator bind transform

我想将boost :: transform_iterator与boost :: bind一起使用来返回成员函数的结果。

e.g。

class Foo
{
public:
//...
Bar& getBar();
const Bar& getBar() const;
};

我有一个一元的Function对象来选择getBar()函数

struct getBar: public std::unary_function<Foo&,Bar&>
{
  getBar::result_type operator()(getBar::argument_type arg ) const {
    return arg.getBar()
  }
};

并且假设我已经在std :: vector中存储了几个Foo对象而我正在使用像这样的tranform_iterator

int main()
{
  typedef std::vector<Foo> VEC;
  typedef boost::transform_iterator<getBar,VEC::iterator> iterator;
  VEC vec;
  vec.push_back( Foo ());
  iterator i( vec.begin() );
  //...
  Bar = *i;
  return 0;
};

但是如果我想使用boost :: bind而不是getBar仿函数,我该怎么做呢。我不确定我必须将哪个模板参数传递给transform_iterator。

编辑:

使用boost :: function的解决方案是一个良好的开端,但我并不完全满意,所以尝试了一下并查看了boost :: mem_fn的返回类型

typedef boost::transform_iterator<boost::_mfi::mf0<Bar&,Foo>,VEC::iterator> iter;
typedef boost::transform_iterator<boost::_mfi::cmf0<const Bar&,Foo>,VEC::const_iterator> citer;

但这个解决方案还有另外一个问题。 因为

iter i(v.begin(), boost::mem_fn( &Foo::getBar ));
citer ci(v.begin(), boost::mem_fn( &Foo::getBar ));

导致以下错误

call of overloaded mem_fn(<unresolved overloaded function type>) is ambiguous

编译器无法识别请求哪个getBar函数,我不得不帮他一点。

iter i(v.begin(), boost::mem_fn( static_cast<Bar& (Foo::*)()>(&Foo::getBar) ));
citer ci(v.begin(), boost::mem_fn( static_cast<const Bar& (Foo::*)() const >(&Foo::getBar) ));

这可能不比手工编写一个仿函数快,但至少它帮助我理解了boost :: mem_fn更多。

1 个答案:

答案 0 :(得分:5)

boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator>