Применить преобразование к вектору с индексом, используя функцию шаблона

Я пытаюсь применить преобразование к вектору, а также добавляю индекс в функцию преобразования. Я использую следующую функцию преобразования transformWithIndex. Если я удаляю idx из result.push_back(itransformationFunction(idx, element));, он работает правильно.

I understood that I have an extra argument. But I don't understand how to modify the transformation function in order to handle the IDX.


// Example program That can be tested
#include <iostream>
#include <string>
#include <vector>

template <typename Range, class TransformationFunction>
inline std::vector<typename std::result_of<TransformationFunction(typename Range::value_type)>::type>
transformWithIndex(const Range &iRange, const TransformationFunction &itransformationFunction) {
  std::vector<typename std::result_of<TransformationFunction(typename Range::value_type)>::type> result;
  int                                                                                            idx = 0;
  for (auto &&element : iRange) {
    result.push_back(itransformationFunction(idx, element));
    idx++;
  }
  return result;
}

int main()
{
   std::vector<int> source = {1, 2, 3};
   std::vector<int> result = transformWithIndex(source, [](int i) { return ++i; });

   return 0;
}

Ошибки следующие:

>  In instantiation of 'std::vector<typename
> std::result_of<TransformationFunction(typename
> Range::value_type)>::type> transformWithIndex(const Range&, const
> TransformationFunction&) [with Range = std::vector<int>;
> TransformationFunction = main()::<lambda(int)>; typename
> std::result_of<TransformationFunction(typename
> Range::value_type)>::type = int]': 21:82:   required from here 12:58:
> error: no match for call to '(const main()::<lambda(int)>) (int&,
> const int&)' 21:58: note: candidates are: 12:58: note: int (*)(int)
> <conversion> 12:58: note:   candidate expects 2 arguments, 3 provided
> 21:65: note: main()::<lambda(int)> 21:65: note:   candidate expects 1
> argument, 2 provided
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы звоните itransformationFunction(idx, element) (2 аргумента) тогда как ваша лямбда когда-то ожидала одного.

Измените вызов на что-то вроде:

transformWithIndex(source, [](int index, int &elem) { return index + 1; })

и ваш result_of тоже должен быть исправлен, чтобы включить индекс:

template <typename Range, class TransformationFunction>
std::vector<typename std::result_of<TransformationFunction(std::size_t, typename Range::value_type)>::type>
transformWithIndex(const Range &iRange, const TransformationFunction &itransformationFunction) {
  std::vector<typename std::result_of<TransformationFunction(std::size_t, typename Range::value_type)>::type> result;
  int                                                                                            idx = 0;
  for (auto &&element : iRange) {
    result.push_back(itransformationFunction(idx, element));
    idx++;
  }
  return result;
}

и std::decay_t, вероятно, следует применять для обработки случаев, когда функтор возвращает ссылку или константные объекты.

@HaniGotc: потому что все ваши result_of тоже нужно изменить: wandbox.org/permlink/kfs953jtSdr17Gq3

AndyG 22.05.2019 17:00

Другие вопросы по теме