Tag: lambda

将c ++ lambda传递给旧的c函数指针

我必须为旧的c库创建一个c ++包装器。 在类方法中,我必须调用ac函数,它接受其他东西也是函数指针(它是一个事件处理程序,该函数接受一个事件发生时触发的函数)。 一个简单的例子是: void myclass::add_handler(std::function handler, otherstuff…) { /* * Many things. */ type_of_function_pointer_accepted_by_old_c_library_add_handler nameofvariable = [handler](same_arguments_as_in_definition_of_the_old_c_function_pointer_accepted) { /* * Many other things with other stuff to be done before the * handler but always only when fired and not when myclass::add_handler is called. */ handler(); }; old_c_library_add_handler(nameofvariable); /* * Last things. */ } […]

Lambda表达式

有人可以解释我lambda表达式以及它们可以用于什么。 我用Google搜索并且有一个粗略的想法。 大多数例子都给出了c#代码。 普通老C中的lambda表达式怎么样?

Objective C委托还是C风格的块回调?

我正在设计一个类,当发生某些事情时,它会“触发事件”。 这些事件往往与非UI相关。 我想知道这样做的最佳方法是什么。 我一直在探索: 代表 我将定义一个委托类,在init函数中接受委托,并在事件发生时调用委托类上的方法。 C风格的积木 我将定义一个函数指针,并在init函数中接受一个函数。 我会在事件发生时调用它。 在这两种情况下,我可能需要处理多个“源”,因此我需要一组委托或块。 我注意到在iOS编程中,代表往往更喜欢UI框架。 但是我来自函数编程背景,我非常适合接受函数点并在调用站点传递lambdas,我喜欢编译器为你处理吊装变量,你通常需要较少的类状态。 但我发现许多iOS开发人员正在使用委托。 iOS中通常首选的机制是什么?

在C中模拟lambdas?

我应该提一下,我在C中生成代码,而不是手动执行此操作。 我这样说是因为如果背后有很多代码并不重要,因为编译器应该管理它。 无论如何,我如何在C中模拟lambda? 我以为我可以在源代码中的某处生成一个带有随机名称的函数然后调用它? 我不太确定。 我还没有真正尝试过任何东西,因为我想在实现它之前把想法弄清楚。 是否有某种预处理器指令可以做,或者某些宏可以使这个更清洁? 我受到了Jon Blow的启发,尝试编译器开发,他似乎用他的语言Jai实现了Lambdas。 但是,我认为他做了一些他生成字节码然后进入C的东西? 我不确定。 编辑:我正在编写一个编译器,编译器只是我的一个项目让我忙碌,而且我想了解更多有关编译器的知识。 我主要使用clang,我使用的是Ubuntu 14.10。 我没有任何垃圾收集,但我想尝试使用某种智能指针-y / rust / ARC启发的内存模型来进行垃圾收集,即几乎没有开销。 我选择C是因为我想更多地涉足它。 我的项目是免费软件,只是一个爱好项目。

如何将C ++ lambda传递给需要函数指针和上下文的C-callback?

我正在尝试在使用标准函数指针+上下文范例的C-API中注册回调。 这是api的样子: void register_callback(void(*callback)(void *), void * context); 我真正想做的是能够注册一个C ++ lambda作为回调。 另外,我希望lambda是一个捕获变量的(即无法转换为直接无状态std::function ) 我需要写什么样的适配器代码才能将lambda注册为回调?

C ++ 0x是否支持__stdcall或extern“C”capture-nothing lambdas?

昨天我在考虑是否可以使用C ++ 0x lambda函数的便利来编写Windows API函数的回调。 例如,如果我想将一个lambda用作EnumChildProc的EnumChildWindows怎么办? 就像是: EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) { // … return static_cast(TRUE); // continue enumerating }, reinterpret_cast(&myData)); 另一个用途是为C例程编写extern “C”回调。 例如: my_class *pRes = static_cast(bsearch(&key, myClassObjectsArr, myClassObjectsArr_size, sizeof(my_class), extern “C” [](const void *pV1, const void *pV2) { const my_class& o1 = *static_cast(pV1); const my_class& o2 = *static_cast(pV2); int res; // […]