Относительно строки в вашем коде:
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);
};