假设您想对函数执行数学运算。数学上我们知道f(x)*g(x)
也是f
和g
的函数。
如何用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
吗?什么是正确的方法?
答案 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*
的工业级实施会尝试捕获f
和g
的实际类型,因此composed
将成为模板。