Функция C ++ с общим и необязательным классом - PullRequest
0 голосов
/ 13 декабря 2018

Я определяю эту функцию с помощью универсального (и необязательного) объекта класса:

template <class OptionalClass = void>
double galg(std::function<double(std::vector<double>, OptionalClass)> func, std::vector<double>& parameters, OptionalClass extrainfo);

И использую его как:

double res = galg(fun, par, extra);

Где:

std::vector<double> par;
c_myclass extra;
double fun(std::vector<double> parameters, c_myclass extrainfo);

Однако я продолжаю получать эту ошибку:

error: no matching function for call to ‘galg(double (&)(std::vector<double>, c_myclass), std::vector<double>&, c_myclass&)’
   err = galg(fun, par, extra);
                                                                                                   ^
In file included from ... note: candidate: ‘template<class OptionalClass> double galg(std::function<double(std::vector<double>, OptionalClass)>, std::vector<double>&, OptionalClass)’

 double galg(
        ^~~~~~~~~~~
... note:   template argument deduction/substitution failed:
... note:   mismatched types ‘std::function<double(std::vector<double>, OptionalClass)>’ and ‘double (*)(std::vector<double>, c_myclass)’
   err = galg(fun, par, extra);

Почему?Что я делаю не так?

1 Ответ

0 голосов
/ 13 декабря 2018

шаблонные аргументы не выполняют неявные преобразования.

Проблема здесь в том, что вы передаете указатель на функцию на fun, равный double (*) (std::vector<double>, c_myclass), а параметр функции ожидает std::function<double(std::vector<double>, OptionalClass)>, ииспользует параметр шаблона, который в данный момент неизвестен.

Ваши параметры:

  • предоставляют явный аргумент шаблона: galg<c_myclass>(fun, par, extra)
  • триггернеявное преобразование перед вызовом galg:

    galg(std::function(f), par, extra)
    

и третья любезность @aschepler - запретить вычет по первому параметру и пусть третий выводит OptionalClass:

template <class T> struct identity {using type = T;};
template <class T> using identity_t = typename identity<T>::type;

template <class OptionalClass>
double galg(identity_t<std::function<double(std::vector<double>,OptionalClass)>> func, std::vector<double>& params, OptionalClass extra);

galg(fun, par, extra);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...