Как хранить std :: sqrt в std :: function - PullRequest
3 голосов
/ 05 марта 2020

std::sqrt() относится к типу std::complex<T>(const std::complex<T>&). Почему я не могу сохранить его в этом std::function? Я получаю ошибку:

ошибка: преобразование из '' в нескалярный тип '' std :: function (const std :: complex &)> 'запрашивается

Запустите его здесь:

#include <complex>
#include <functional>
#include <iostream>

int main(){
    using Complex = std::complex<double>;
    std::function<Complex(const Complex&)> f = std::sqrt;
    std::cout << "sqrt(4): " << f(std::complex<double>(4,0)) << "\n";
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

Относительно строки в вашем коде:

std::function<Complex(const Complex&)> f = std::sqrt;

Вы должны принять во внимание, что std::sqrt() это не обычная функция, а шаблон функции :

template<class T>
complex<T> sqrt(const complex<T>& z);

Вы определили Complex в терминах std::complex шаблона класса:

using Complex = std::complex<double>;

, поскольку std::complex содержит тип члена value_type, который соответствует переданному шаблонному аргументу (т.е. double в данном случае), вы можете просто сделать:

std::function<Complex(const Complex&)> f = std::sqrt<Complex::value_type>;

Это эквивалентно прямой передаче double в качестве аргумента шаблона в std::sqrt():

std::function<Complex(const Complex&)> f = std::sqrt<double>;

Однако первый более обобщенный c, чем второй, поскольку он позволяет изменять std::complex аргумент шаблона - например, используя int или float вместо double - без необходимости редактировать исходный код, соответствующий назначению.


Начиная с C ++ 14, вы также можете переносить вызовите std::sqrt() с помощью generi c lambda и назначьте эту лямбду для объекта std::function:

std::function<Complex(const Complex&)> f = [](auto const& x) { 
   return std::sqrt(x); 
};
2 голосов
/ 05 марта 2020

Вы просто забыли параметр шаблона для назначения.

#include <complex>
#include <functional>
#include <iostream>

int main(){
    using Complex = std::complex<double>;
    std::function<Complex(const Complex&)> f = std::sqrt<double>;
    std::cout << "sqrt(4): " << f(std::complex<double>(4,0)) << "\n";
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...