#include <functional>
#include <vector>

template <typename ...T, typename Result>
void componentWise(std::function<Result(T...)> f,
                   const std::vector<T> & ...v,
                   std::vector<Result> & result)
{
    // (I don't know how to express the assert)
    result.reserve(v.size()...);

    auto _v = v.begin()...;
    auto _result = result.begin();
    for(; _v != v.end()...; ++_v..., ++_result)
    {
        *_result = expression(*_v...);
    }
}