std :: function的重载运算符?

时间:2015-08-19 21:50:01

标签: c++ c++11 operator-overloading std functor

假设您想对函数执行数学运算。数学上我们知道f(x)*g(x)也是fg的函数。

如何用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吗?什么是正确的方法?

2 个答案:

答案 0 :(得分:2)

这将是

func operator* (const func &f, const func &g) 
{
        return [=](double x) { return f(x) * g(x); }
}
但是,我不建议这样做。首先,因为您无法向std添加内容,ADL无法找到此运算符,因此您必须依赖于简单的非限定查找,这种查找最多是脆弱的。此外,多层std::function的效率非常低。

答案 1 :(得分:1)

在返回类型中不需要类型擦除。你真的想要这样的东西:

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仍然可以转换为一个。但是当您将其传递给std::transform时,直接调用composed会更有效。

事实上,operator*的工业级实施会尝试捕获fg的实际类型,因此composed将成为模板。