gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:15 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com