Вызов двух версий одной и той же функции шаблона, переданной в качестве аргумента в C ++ - PullRequest
0 голосов
/ 14 января 2019

Я хочу вызвать две версии одной и той же функции в функции. Например:

template<class F>
auto ulp_error(F f, float x)
{
    float f1 = f(x);
    double x2 = x;
    float f2 = static_cast<float>(f(x2));
    return boost::math::float_distance(f1, f2);
}

Теперь я бы хотел вызвать эту функцию через:

ulp_error(std::log, 1.2f);

но я получаю следующую ошибку на clang-1000.11.45.5:

fatal error: no matching function for call to 'ulp_error'
    ulp_error(std::log, 1.2f);
note: candidate template ignored: couldn't infer template argument 'F'

Хорошо, а как насчет этого?

ulp_error<decltype(std::log)>(std::log, 1.2f);

, которая выдает следующую ошибку:

fatal error: reference to overloaded function could not be resolved; did you mean to call it?
    ulp_error<decltype(std::log)>(std::log, 1.2f);

Как я могу передать (скажем) std::log в качестве аргумента функции и вызвать ее двумя разными типами?

1 Ответ

0 голосов
/ 14 января 2019

Может быть, как следует?

ulp_error([](auto x){ return std::log(x); }, 1.2f);

Я имею в виду ... std::log - перегруженная функция; поэтому использование std::log (или decltype(std::log) не работает, потому что компилятор не может выбрать правильную версию. И вы не можете передать их обе.

Но если передать его в шаблон-шаблон, исправленная версия выбирается по типу параметра x лямбда.

Другим возможным решением должно быть приведение к правильному типу, например

ulp_error(static_cast<double(*)(double)>(&std::log), 1.2f);

но (MHO) я нахожу этот синтаксис немного уродливым.

...