Как передать два параметра при использовании std:: mem_fun?
Предположим, что у меня такая иерархия (это просто тестовая программа. Не указывайте ничего, связанное с утечками памяти, деструктор не является виртуальным и т.д.):
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, но я не могу понять, как это сделать. Любой ключ, как это сделать? Я не использую boost.
Ответы
Ответ 1
Вы можете создать свой собственный функтор следующим образом:
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));
Ответ 2
Вы не можете сделать это с помощью std binders. Вы можете, конечно, написать свой собственный функтор.
struct TwoArguments
{
int one;
int two;
TwoArguments( int one, int two ) : one(one),two(two){
}
void operator()( I* i ) const {
i->fun( one, two );
}
};
Ответ 3
Другой способ сделать это - использовать шаблоны. (Скажите, пожалуйста, если это плохая практика!)
template<int N, int N1>
void Apply(I* i)
{
i->fun(N, N1);
}
std::for_each(a.begin(), a.end(), Apply<firstParam, secondParam>);
Это было бы хорошо, если бы вы не намеревались называть его множеством разных параметров, так как он создавал код для каждой комбинации, которую вы сделали.