不知道如何更好地改写标题。
我希望将低级代码移到一个简单函数之外并将代码移到类中,以便类处理更复杂的东西。
我想离开这个:
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> :: operator()':函数必须返回值” - 因为指针。我怎么能解决这个问题?返回虚空无效。通过引用传递参数(函数“func”)也不起作用(因为在这种情况下,lambda不仅仅是一个函数而是一个类) - 寄存器(void(__ cdecl * func) )())无法转换现在不是函数lambda。
任何想法如何解决我的问题?
答案 0 :(得分:0)
有两个问题,一个是类型,一个是你声明lambda返回一个函数指针但实际上没有返回任何内容。
第一个可以通过使用模板轻松解决:
struct AClass
{
template<typename Ft>
static void b(Ft func)
{
auto funcA = [&func]()
{
// Do some stuff
func();
// Do some other stuff
};
some_register_function(funcA);
}
};
正如您所看到的,我还更改了lambda声明,因为在您的版本中,您实际上调用它,它也将调用您作为参数传入的函数指针,这解决了第二个问题。
请注意,我实际上并不知道它是否可行,因为glutDisplayFunc
是纯C库中的纯C函数,并且对lambdas或函数对象一无所知。