簡體   English   中英

std :: function的重載運算符?

[英]Overload operators for std::function?

假設您要對函數執行數學運算。 從數學上講,如果fgf ,則f(x)*g(x)也是一個函數。

如何用std::function表達這一點? 我當時想讓數學運算符重載,如下所示:

typedef std::function<double(double)> func;

func operator * (const func &f, func &g) 
{
        auto temp = [&] () { return f( ?? ) * g ( ?? ); };
        return temp; 
}

但是我不確定fg的參數在這里如何發揮作用。 我可以為此使用std::placeholders嗎? 正確的處理方式是什么?

這將是

func operator* (const func &f, const func &g) 
{
        return [=](double x) { return f(x) * g(x); }
}

不過,我不建議您這樣做。 首先,由於您無法將內容添加到std ,因此ADL無法找到該運算符,因此您必須依靠簡單的不合格查找,這充其量是很脆弱的。 同樣,多層std::function效率很低。

在返回類型中不需要類型擦除。 您真的想要這樣的東西:

class composed {
   std::function<double(double)> f;
   std::function<double(double)> g;
public:
   composed(std::function<double(double)> f, std::function<double(double)> g) : f(f), g(g) { }
   double operator()(double x) { return f(x) * g(x); }
};
inline composed operator*(std::function<double(double)> f, std::function<double(double)> g) { return composed(f,g); }

這比返回std::function<double(double)>更有效。 如果呼叫者願意, composed仍可以轉換為1。 但是,當你只是把它傳遞給std::transform ,調用composed直接更有效。

實際上,一個具有operator*的行業實力的實現也會嘗試捕獲fg的實際類型,因此, composed將成為模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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