簡體   English   中英

如何在 std::function 中存儲 std::sqrt

[英]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的模板參數-例如,使用intfloat的,而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM