Я хотел бы использовать 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()
}
};
и скажем, я сохранил несколько объектов Foo внутри std :: vector и Im, используя такой 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.