[英]Overload operators for std::function?
假設您要對函數執行數學運算。 從數學上講,如果f
和g
為f
,則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;
}
但是我不確定f
和g
的參數在這里如何發揮作用。 我可以為此使用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*
的行業實力的實現也會嘗試捕獲f
和g
的實際類型,因此, composed
將成為模板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.