C++ To call member function in for_each for items in the member container
Asked Answered
P

1

4

If I have a class (that mimic some of STL's container) like this:


class Elem {
public:
  void prepare(); // do something on *this
  // ...

};

class Selector {
public:
  typedef vector<Elem *> container_type;
  typedef container_type::iterator iterator;

  iterator begin() { return cont_.begin(); }
  iterator end() { return cont_.end(); }

  void check_all();

private:
  prepare_elem(Elem *p); // do something on 'p'
  container_type cont_;

};

If I want to call prepare() for all elements in 'cont_', I could make the following function:


void Selector::check_all() {
  for_each(cont_.begin(), cont_.end(), mem_fun(&Elem::prepare));

}

My question is, what if I want to call Selector::prepare_elem() for all elements in 'cont_'? My initial approach won't compile:


void Selector::check_all() {
  for_each(cont_.begin(), cont_.end(),
           mem_fun(&Selector::prepare_elem));

}

Second approach also failed:


void Selector::check_all() {
  for_each(cont_.begin(), cont_.end(),
           bind1st(mem_fun(&Selector::prepare_elem), this));
}

Is there anyway to use std::for_each() to call Selector::prepare_elem()?

If there's way, I'd like to know a solution without boost.

Pinkeye answered 18/10, 2010 at 5:46 Comment(3)
What are the error messages you're getting? FTR, this question looks like it's addressing a similar issue. https://mcmap.net/q/832276/-mem_fun-and-bind1st-problemVasculum
Hmm, I answered without looking closely enough at your last attempt. That should be valid, see it compile here (errors are from the linker): ideone.com/xD5b3Ballard
Did you provide implementation for prepare_elem ? Otherewise, there is no issue.Furculum
D
1

If you don't want to use boost::bind - use std::tr1::bind.

Discountenance answered 18/10, 2010 at 6:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.