我想将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更多。
答案 0 :(得分:5)
boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator>