Это то, что я придумал при первом проходе. Моему неопытному глазу это кажется разумным, но компилятору это не нравится:
Код: Выделить всё
template std::array map(F mapper, const std::array &elements)
{
std::array newArray{};
for (std::size_t i = 0; i < N; i++) {
newArray[i] = mapper(elements[i]);
}
return newArray;
}
// ...
int main()
{
std::array ints1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto doubles1 = map([](int x) -> double { return x*2.5; }, ints1);
}
Код: Выделить всё
functional.cpp:87:19: error: no matching function for call to 'map'
auto doubles1 = map([](int x) -> double { return x*2.5; }, ints1);
^~~~~~~~~~~~
functional.cpp:22:79: note: candidate template ignored: couldn't infer template argument 'V'
template std::array map(F mapper, std::array &elements)
^
1 error generated.
Я, конечно, ожидал, что код скомпилируется, но что-то не так. Я все еще новичок в жаргоне C++, поэтому мне трудно понять, что именно нужно Google, чтобы решить эту проблему. Одним из возможных решений, которое я придумал, было использование выходного параметра:
Код: Выделить всё
template void map_outParam(F mapper, std::array &elements, std::array &out)
{
for (std::size_t i = 0; i < N; i++) {
out[i] = mapper(elements[i]);
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... plate-in-c