I think user 463035818's answer resolved your problem.
But if you want to write a template function, you can write something like this:
#include <cmath>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>
template <typename T>
T my_sqrt(T value)
{
return std::sqrt(value);
}
template <typename I, typename ElementType>
auto sqrt_function(std::function<I(I)> sqrt_func, const std::vector<I>& elements) -> std::vector<ElementType>
{
std::vector<ElementType> results;
std::transform(elements.cbegin(), elements.cend(), std::back_inserter(results), sqrt_func);
return results;
}
int main()
{
std::vector<double> results = sqrt_function<float, double>(my_sqrt<float>, std::vector<float>(10, 9.f));
std::copy(results.cbegin(), results.cend(), std::ostream_iterator<double>(std::cout, ", "));
}
And if you want to use template template parameter you can modify above code like below
template <typename I, template<typename> class List, typename ElementType>
auto sqrt_function(std::function<I(I)> sqrt_func, const List<I>& elements) -> std::vector<ElementType>
{
std::vector<ElementType> results;
std::transform(elements.cbegin(), elements.cend(), std::back_inserter(results), sqrt_func);
return results;
}
int main()
{
std::vector<double> results = sqrt_function<float, std::vector, double>(my_sqrt<float>, std::vector<float>(10, 9.f));
std::copy(results.cbegin(), results.cend(), std::ostream_iterator<double>(std::cout, ", "));
}