Threaded generalised transform
You probably want to forward your parameters:

   *result = f(*first, params...);


Try:

   *result = f(*first, std::forward&lt;Params&gt;(params)...);


To go along with forwardign you probably want two versions of trans() on that takes values by reference/value one that takes r-value references:

// Normal parameters.
trans(InputIterator first, InputIterator last, OutputIterator result,
      Function f, Params const&amp;... params)

// R-Value parameters.
trans(InputIterator first, InputIterator last, OutputIterator result,
      Function f, Params&amp;&amp;... params)


Going to main transform function.

I am not sure you in realty want to pass a function and arguments. That's the whole point of the lambda. So you can wrap the function call and its parameters into a function.

threaded_transform(4, values.cbegin(), values.cend(), results.begin(), sum, 10);

// Or would you prefer:

threaded_transform(4, values.cbegin(), values.cend(), results.begin(),
    [](int other){ return add(other, 10);}
);

//Or even
threaded_transform(4, values.cbegin(), values.cend(), results.begin(),
    [](int other){ return 10 + other;}
);


If you do this you should write details about your iterator requirements.

The requirements for std::transform()

template&lt;class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction&gt;
OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, OutputIterator result,
                         BinaryFunction binary_op);


Where:
   InputIterator must be a model of Input Iterator.
   OutputIterator must be a model of Output Iterator. 


In your threaded implementation you have a more stringent requirement for the output iterator. I believe it needs to be random access iterator.

    OutputIterator must be a model of Random Access Iterator. 


See: http://www.sgi.com/tech/stl/RandomAccessIterator.html