boost :: transform_iterator和boost :: bind

P3t*_*rus 1 c++ boost iterator bind transform

我想使用boost :: transform_iterator和boost :: bind来返回成员函数的结果.

例如

class Foo
{
public:
//...
Bar& getBar();
const Bar& getBar() const;
};
Run Code Online (Sandbox Code Playgroud)

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

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

并且假设我已经在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;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用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;
Run Code Online (Sandbox Code Playgroud)

但这个解决方案有另一个问题.因为

iter i(v.begin(), boost::mem_fn( &Foo::getBar ));
citer ci(v.begin(), boost::mem_fn( &Foo::getBar ));
Run Code Online (Sandbox Code Playgroud)

导致以下错误

call of overloaded mem_fn(<unresolved overloaded function type>) is ambiguous
Run Code Online (Sandbox Code Playgroud)

编译器无法识别请求哪个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) ));
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 5

boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator>
Run Code Online (Sandbox Code Playgroud)

  • @Alexandre:我不知道,可能.我不推荐这种方法; 我只是在回答这个问题. (2认同)