因此,我有一个基本上是工厂函数,用于生成从int到int的std::函数,一个快速的最小示例是
std::function<int(int)> functionMaker(int x) {
return [x](int foo){return foo*x;};
}
基本上,我想将一些值绑定到函数中(有点像currying(,然后稍后调用它。
我想通过类似的方式使用它
functionMaker{2}(10)
但我错了。
我验证了
functionMaker(2)(10)
工作
我探索了如果我存储了这个函数,然后调用它会发生什么
auto fct = functionMaker{2};
std::cout << fct(10) << std::endl;
失败,但
auto fct = functionMaker(2);
std::cout << fct(10) << std::endl;
工作。
所以看起来牙套在这里根本不起作用。怎么回事?重申一下,我想用类似functionMaker{2}(10)
的东西来称呼它。通过这种方式,我更容易理解哪一部分是结构,哪一部分就是调用。我在这里错过了什么?
如果您希望functionMaker{}
工作,那么functionMaker
需要是一个类/结构。函数只能通过()
接受参数。然而,将其作为一个类相对容易:
struct functionMaker
{
functionMaker(int x)
: f([x](int foo){return foo*x; }) {}
int operator()(int foo) { return f(foo); }
std::function<int(int)> f;
};
它有点笨拙,但你只需要写一次;你甚至可以把它概括为make_functionMaker(f, ...)
。
请注意,只需在operator()
中实现函数,就可以节省std::function
的开销。