如何调用在另一个堆栈流中创建的函子对象

How to call a created functor object as found in another stackoverflow?

本文关键字:创建 对象 堆栈 另一个 何调用 调用      更新时间:2023-10-16

在stackoverflow question Template函数中,有一个通过CreateFunctor调用创建的函子对象,该函数可以获取lambda或函数指针并推导传递给另一个模板的参数。如何使用它来调用doSomething

int main(){
    auto f1 = CreateFunctor([](int a, int b){doSomething(a, b);}, 1, 2);
    f1(1,2);
}

不起作用。

请参阅http://coliru.stacked-crooked.com/a/954b1f64fd13739e例如。

您引用的帖子中CreateFunctor的目的是创建一个函数对象,该对象在构造时将参数绑定到lambda。

您可以在对CreateFunction的调用中执行此操作,但也可以在调用函数对象时再次传递参数。

因为这些论点已经被绑定,所以这是不必要的(事实上也是不可能的)。

只需调用f1()。

评论:引用的帖子试图提高绑定函数对象的性能,而不是std::function已经提供的性能。我怀疑作者过早地进行了优化。Std::函数已经内置了性能优化。

编辑:在链接的末尾找到代码

编译器错误消息非常明确:

./functor.cpp:57:5: error: type 'Functor<int, int>' does not provide a call operator

问题就在这里:

template<class... Args> struct Functor{
    Functor(void (*)(Args...)) {std::cout << "Functorn" << std::endl;}
    void Set(Args...) {std::cout << "Setn" << std::endl;}
};

Functor模板类不完整。它没有定义呼叫操作员(根据错误消息)。

为什么不省去麻烦,使用标准对象呢?

auto f1 = std::function([] { do_something(1, 2); });
f1();

auto f1 = std::function([a = 1, b = 2]{ do_something(a,b); });