【问题标题】:Convert Object Based Lambda to Function Pointer将基于对象的 Lambda 转换为函数指针
【发布时间】:2022-01-16 09:01:38
【问题描述】:

说我这边有这个程序情况:

struct A
{
    int(*func_ptr)();
};

struct B
{
    int b = 0;
    void SetFunctionPointerToLambda(A& a)
    {
        a.func_ptr = [=] () { return b; };
    }
};

int main()
{
    A a;
    B b;
    b.SetFunctionPointerToLambda(a);
}

我想将对象 A 的函数指针设置为 lambda,它基于对象 B 的值。 那么,这要怎么做呢?

当前错误信息:

loeschen5.cc: In member function 'void B::SetFunctionPointerToLambda(A&)':
loeschen5.cc:14:41: error: cannot convert 'B::SetFunctionPointerToLambda(A&)::<lambda()>' to 'int (*)()' in assignment
         a.func_ptr = [=] () { return b; };
                                         ^

感谢您的帮助!

【问题讨论】:

  • 这能回答你的问题吗? Passing capturing lambda as function pointer
  • 为了能够捕获b,lambda 必须表现得像一个结构。所以不能转换成函数指针。
  • 好的,所以当我确定在某些情况下 b 不会改变时,我可以用 b ( = 0) 的实际值替换 b 吗?
  • ... 或者我可以以某种方式将 b 的地址传递给 lambda 吗?
  • 当然可以,您只需将函数指针更改为指向带参数的函数的指针。

标签: c++ function pointers lambda member


【解决方案1】:

好的,所以我用一个函数对象解决了这个问题:

所以,不仅存储了函数,还存储了必要的变量:

struct FunctionObject
{
    const int *b;
    int operator ()() const
    {
        return *b;
    }
};

struct A
{
    FunctionObject func_ptr;
};

struct B
{
    int b = 56;
    void SetFunctionPointerToLambda(A& a) const
    {
        a.func_ptr = FunctionObject { &b };
    }
};

int main()
{
    A a;
    B b;
    b.SetFunctionPointerToLambda(a);
}

而且效果很好。

【讨论】:

  • 您可以使用std::function&lt;int()&gt; 代替
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2013-03-17
相关资源
最近更新 更多