Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Boost :: transform_iterator и boost :: bind

Автор вопроса: P3trusОтветов: 0

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

c++boostbinditeratortransform

На этот вопрос пока нет ответов в архиве.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы