Каков идиоматический способ создания шаблона функции преобразования U в V в C++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Каков идиоматический способ создания шаблона функции преобразования U в V в C++?

Сообщение Anonymous »

Сейчас я изучаю C++ и пробую некоторые функции шаблонов. Я пытаюсь создать общий шаблон, который получает функцию F от U до V, std::array типа U, а затем возвращает (через NRVO) массив типа V.
Это то, что я придумал при первом проходе. Моему неопытному глазу это кажется разумным, но компилятору это не нравится:

Код: Выделить всё

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);
}
Я использую clang 16.0.6, и он говорит мне:

Код: Выделить всё

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.
На мой взгляд, мне кажется, что я могу что-то сделать, чтобы намекнуть компилятору, что лямбда-выражение возвращает двойное значение, и, следовательно, auto должно быть выведено как std ::array. Есть ли что-то простое, что мне не хватает? Спасибо.
Я, конечно, ожидал, что код скомпилируется, но что-то не так. Я все еще новичок в жаргоне 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»