c++中从Lambda函数生成Functor

Make Functor from a Lambda Function in C++

本文关键字:Functor 函数 中从 Lambda c++      更新时间:2023-10-16

是否可以在c++中从lambda函数创建一个函子?

如果没有,为什么没有?

这给我带来了一点意想不到的麻烦。

实际用例:

另一个函数需要像这样创建函子:

Class::OnCallBack::MakeFunctor(this, &thisclass::function);

通常为了使用这个,我必须在thisclass中创建一个函数,这意味着添加到头文件中。经过多次使用后,会有一些膨胀。我想通过以下方式来避免这种臃肿:

Class::OnCallBack::MakeFunctor(this, 
    void callback()
    { []() { dosomething; } });

出错的是编译错误。即使它可以编译,是否有可能做这样的事情?

如果你想存储lambda函数你可以像这样存储void()函数

std::function< void() > callback = [](){ dosomething };

或者,对于具有返回类型和形参的函数,

std::function< int( int ) > callback = []( int i ){ return dosomething(i);}

你需要包含这个文件来使用std::function

#include <functional>

您没有指定Class::OnCallBack::MakeFunctor的签名,所以我猜它是这样的:

template<typename T>
Functor<T> MakeFunctor(T*, doesnt_matter (T::*)(doesnt_matter));

只是因为this在您的示例中显式传递。

在这种情况下,这不是c++的问题,而是你的MakeFunctor。如果是:

template<typename F>
Functor<F> MakeFunctor(F f);

你可以把它叫做:

Class::OnCallBack::MakeFunctor([]() { dosomething; });

c++中没有lambda函数。c++中的"lambda"结构定义了一个具有operator()的类。一个函子。它还定义了该类的一个实例。

我不知道你的实际问题是什么,但我猜它与你不能命名的类型有关。您通常可以通过使用decltype来解决这个问题,例如:

auto f = [](...) { ... };
typedef decltype( f ) LambdaType;

另一个问题可能是lambda的每个实例,甚至是相同的实例,具有不同的,不相关的类型。同样,解决方案可能是使用auto创建具有单个lambda实例的命名变量。