Lets say I have hierarchy like this (This is just a test program. Please do not point anything related to memory leaks, destructor is not virtual etc):
class I
{
public:
    virtual void fun(int n, int n1) = 0;
};
class A : public I
{
public:
    void fun(int n, int n1)
    {
        std::cout<<"A::fun():" <<n<<" and n1:" <<n1<<"\n";
    }
};
class B : public I
{
public:
    void fun(int n, int n1)
    {
        std::cout<<"B::fun():" <<n<<" and n1:" <<n1<<"\n";
    }
};
int  main()
{
    std::vector<I*> a;
    a.push_back(new A);
    a.push_back(new B);
    //I want to use std::for_each to call function fun with two arguments.
}
How do I call fun() method which takes two arguments using the std::for_each ? I think I have to use std::mem_fun probably with std::bind2nd but am not able to figure out how to do this. Any clue how to achieve this? I am not using boost.
You could create your own functor like this:
class Apply
{
private:
  int arg1, arg2;
public:
  Apply(int n, int n1)
    : arg1(n), arg2(n1) 
  {}        
  void operator() (I* pI) const
  {
    pI->fun(arg1, arg2);
  }
};
int main ()
{
  // ...
  std::for_each(a.begin(), a.end(), Apply(n, n1));
}
or use boost::bind like this:
std::for_each(
  a.begin(),
  a.end(),
  boost::bind(&I::fun, _1, n, n1));
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With