c++ - 如何在函数中调用lambda函数作为参数?

标签 c++ pointers c++11 lambda

不知道如何更好地改写标题。

我想将低级代码移到简单函数之外,并将代码移到类中,以便类处理更复杂的事情。
我想从这里开始:

void a(void) {
    [low level operation];
    //User typed simple operations
    [low level operation];
}

static void AClass::b() {
    register(a); //register(void (__cdecl *func)())
}

int main(void) {
    AClass::b();
    return 0;
}

收件人:

void a(void) {
    //[no low level operation]
    //User typed simple operations
    //[no low level operation]
}

static void AClass::b(void (*func)()) {
    auto funcA = [] (void (*func)()) -> void (*)() { 
        [that first low level operation]; 
        func(); //Which is: void a(void);
        [the second low level operation]; 
    };
    register(funcA(func));
}

int main(void) {
    AClass::b(&a);
    return 0;
}

目前我收到错误“::operator ()' : function must return a value”——因为指针。我该如何解决这个问题?只返回 void 是行不通的。通过引用 lambda 传递参数(函数“func”)也不起作用(因为在这种情况下,lambda 不再只是一个函数,而是一个类)- register(void (__cdecl *func )()) 无法转换现在不是函数的 lambda。

有什么办法可以解决我的问题吗?

最佳答案

有状态的 lambda 不能变成函数指针。

只有没有状态的 lambda 才能变成函数指针。

您的状态需要通过一些后门滑入。 glutDisplayFunc , 只需要一个无状态的函数指针。无法对其进行修改。

如果你能找到一个后门来存储一些东西,你可以用它来存储任意的 lambda。在这种情况下,glutDisplayFunc与当前窗口相关联。是否有任何地方可以让您在当前窗口中推送状态,并找出是哪一个?

假设你找到这样一个 void* .然后简单地分配一个std::function<void()> , 将其插入其中,并注册以下 lambda:

void AClass::b(void (*func)()) {
   auto funcA = [func] () { 
     [that first low level operation]; 
     func(); //Which is: void a(void);
     [the second low level operation]; 
   };
   registerPVoidSomewhere( new std::function<void()>( funcA ) );

   register([]() {
     void* pVoid = getPVoidFromWhereIHideItAbove();
     std::function<void()>* pFunc = reinterpret_cast<std::function<void()>*>( pVoid );
     if (pFunc) {
       (*pFunc)();
     };
   } );
}

现在,我打赌当 glutDisplayFunc被调用时,当您可以询问 glut 时,它是从上下文中调用的当前窗口是什么。也许那个窗口有一个用户定义的位置 void* , 或者你可以有一个从窗口指针到 void* 的全局映射您管理的(在第二种情况下,您甚至可以拥有从窗口指针到 std::function<void()> 的全局映射,并摆脱那种讨厌的转换)。

关于c++ - 如何在函数中调用lambda函数作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15695848/

相关文章:

C++ shared_ptr<Base> 指针访问冲突

c++ - 多个可互换 View (MFC/C++)

C++删除二维指针 vector

c++ - 当参数是初始化列表且参数是引用时的重载解析

c++ - 在 C/C++ 中向指针添加 1 个字节的正确方法是什么?

c++ - 什么是 move 语义?

c++ - 错误 : redeclaration differs in ‘constexpr’

c++ - 删除复制构造函数是否也会删除默认的复制/移动运算符?

C++ 创建 PrintLine 函数

java - Android 将 Java API 追溯到 jni