无法构造带有大括号初始化的 std::函数


编辑:我太笨了。令人震惊的是,functionMaker调用是一个函数,而不是构造函数,所以大括号显然不起作用。

因此,我有一个基本上是工厂函数,用于生成从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的开销。

相关内容

  • 没有找到相关文章

最新更新