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