[英]How to store std::sqrt in std::function
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;
}
關於代碼中的行:
std::function<Complex(const Complex&)> f = std::sqrt;
:您必須考慮到std::sqrt()
不是普通函數而是:
template<class T>
complex<T> sqrt(const complex<T>& z);
您根據std::complex
類模板定義了Complex
:
using Complex = std::complex<double>;
由於std::complex
包含與傳遞的模板參數(即本例中的double
)對應的成員類型value_type
,您可以這樣做:
std::function<Complex(const Complex&)> f = std::sqrt<Complex::value_type>;
這相當於直接將double
作為模板參數傳遞給std::sqrt()
:
std::function<Complex(const Complex&)> f = std::sqrt<double>;
然而,前者比后者更通用的,因為它可以讓你改變std::complex
的模板參數-例如,使用int
或float
的,而不是double
-而無需編輯相應於分配的源代碼。
從 C++14 開始,您還可以通過泛型 lambda包裝對std::sqrt()
的調用,並將此 lambda 分配給std::function
對象:
std::function<Complex(const Complex&)> f = [](auto const& x) {
return std::sqrt(x);
};
您只是忘記了分配的模板參數。
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.