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

时间:2013-03-29 01:13:06

标签: 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;
}

目前我收到错误“< lambda> :: operator()':函数必须返回值” - 因为指针。我怎么能解决这个问题?返回虚空无效。通过引用传递参数(函数“func”)也不起作用(因为在这种情况下,lambda不仅仅是一个函数而是一个类) - 寄存器(void(__ cdecl * func) )())无法转换现在不是函数lambda。

任何想法如何解决我的问题?

1 个答案:

答案 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或函数对象一无所知。