不知道如何更好地改写标题。
我想将低级代码移到简单函数之外,并将代码移到类中,以便类处理更复杂的事情。
我想从这里开始:
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;
}
目前我收到错误“
有什么办法可以解决我的问题吗?
最佳答案
有状态的 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/