Как передать два параметра при использовании std :: mem_fun? - PullRequest
11 голосов
/ 22 июня 2009

Допустим, у меня такая иерархия (это просто тестовая программа. Пожалуйста, не указывайте ничего, касающегося утечек памяти, деструктор не является виртуальным и т. Д.):

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.
}

Как мне вызвать метод fun (), который принимает два аргумента, используя std :: for_each? Я думаю, что я должен использовать std :: mem_fun, вероятно, с std :: bind2nd, но не могу понять, как это сделать. Любая подсказка, как этого добиться? Я не использую повышение.

Ответы [ 3 ]

7 голосов
/ 22 июня 2009

Вы можете создать свой собственный функтор так:

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));
}

или используйте boost :: bind следующим образом:

std::for_each(
  a.begin(),
  a.end(),
  boost::bind(&I::fun, _1, n, n1));
4 голосов
/ 22 июня 2009

Вы не можете сделать это со связывателями стандартного ввода. Конечно, вы можете написать свой собственный функтор.

struct TwoArguments
{
   int one;
   int two;

   TwoArguments( int one, int two ) : one(one),two(two){
   }

   void operator()( I* i ) const {
       i->fun( one, two );
   }
};
1 голос
/ 22 июня 2009

Еще один способ сделать это - использовать шаблоны. (Пожалуйста, скажите мне, если это плохая практика!)

template<int N, int N1>
void Apply(I* i)
{
  i->fun(N, N1);
}

std::for_each(a.begin(), a.end(), Apply<firstParam, secondParam>);

Было бы хорошо, если бы вы не собирались вызывать его с большим количеством различных параметров, поскольку он генерировал бы код для каждой сделанной вами комбинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...