boost :: transform_iterator и boost :: bind

Я хотел бы использовать 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.


person P3trus    schedule 08.03.2011    source источник


Ответы (1)


person    schedule
comment
Возможно опечатка? Я полагаю, вы имеете в виду Bar&(Foo&) - person Ise Wisteria; 08.03.2011
comment
Здорово. Но разве использование boost::function не снижает производительность? - person Alexandre C.; 09.03.2011
comment
@Alexandre: Возможно, не знаю. Я не рекомендую этот подход; Я просто отвечаю на вопрос. - person Lightness Races in Orbit; 09.03.2011