typedef boost::counting_iterator<int> counter;
std::transform(counter(0), counter(N), A.begin(), myFunction1);
std::transform(A.begin(), A.end(), counter(0), B.begin(), myFunction2);
std::transform(A.begin(), A.end(), B.begin(), C.begin(), myFunction3);
Теперь напишите свою собственную версию std::transform
, которая принимает троичную функцию:
template <typename In1, typename In2, typename In3, typename Out, typename FUNC>
Out transform3(In1 first1, In1 last1, In2 first2, In3 first3, Out out, FUNC f) {
while (first1 != last1) {
*out++ = f(*first1++, *first2++, *first3++);
}
return out;
}
transform3(A.begin(), A.end(), B.begin(), counter(0), D.begin(), myFunction4);
Полагаю, вы могли бы что-то сделать с шаблонами переменных в C ++ 0x, чтобы получить transform_N
, но если это так, я не знаю, что это такое, я никогда не использовал их. Не уверен, что вы можете переслать переменное число аргументов с модификациями (в этом случае * ++
вокруг каждого как бы).