`
kbasm
  • 浏览: 29387 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

方便地将 C++ 成员函数和函数对象转换成 C 风格的回调函数指针

阅读更多
英文原文在这里。

http://www.kbasm.com/cpp-use-member-function-as-c-callback.html

并无玄妙,只是用function traits解析了函数类型然后定义了几个静态函数而已。

用法

    typedef int Compare(const void *, const void *);  
    struct CompareObject {  
        int operator() (const void * a, const void * b) const {  
            return (*(int*)a - *(int*)b);  
        }  
    };  
    struct RevertObject {  
        int revertCompare(const void * a, const void * b) {  
            return (*(int*)b - *(int*)a);  
        }  
    };  
    GCallback cb;  
    CompareObject co;  
    void testPlaincallback() {  
        int values[] = { 6, 2, 1, 3, 5, 4 };  
        const int count = sizeof(values) / sizeof(values[0]);  
        qsort(values, count, sizeof(values[0]), &GPlainFunction::invoke);  
        cout << "Normal qsort: \t\t";  
        for(int i = 0; i < count; ++i) {  
            cout << values[i] << " ";  
        }  
        cout << endl;  
        RevertObject ro;  
        cb = GCallback(&ro, &RevertObject::revertCompare);  
        qsort(values, count, sizeof(values[0]), &GPlainCallback::invoke);  
        cout << "Reverted qsort: \t";  
        for(int i = 0; i < count; ++i) {  
            cout << values[i] << " ";  
        }  
        cout << endl;  
    }  
分享到:
评论

相关推荐

    c++类成员函数作为回调函数

    在C++编程中,将类成员函数作为回调函数是一种常见的设计模式,特别是在处理异步操作、事件驱动编程或与库接口交互时。回调函数本质上是一个可以被其他代码调用的函数,它允许我们传递控制权给第三方代码并在特定...

    C回调C++成员函数,C++回调C函数~测试可用哦~

    // C函数的回调函数指针 } // 在C++代码中注册回调 void registerCallback(MyClass* obj) { callback = &MyClass::callMemberCallback; // 将对象传递给C回调 callbackParam = obj; // 假设callbackParam是全局...

    通过函数指针调用C++非静态成员函数

    在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0 (BCB6.0) 中实现这一功能。 #### 一、...

    C++ 一般(普通)函数指针、类成员函数指针,用法区别,以及强制转换

    在大多数情况下,你应该尽量避免直接进行这种转换,而是考虑使用其他设计模式,如回调函数、函数对象或者std::function。 在实际编程中,理解函数指针的这些概念至关重要,因为它们是许多高级C++技术的基础,如回调...

    C#调用C++动态库,执行回调函数并传递结构体参数

    C++的回调函数需要考虑函数指针的调用约定,通常使用`__stdcall`约定,以确保调用者清理堆栈。 在C#中定义回调函数的委托类型: ```csharp [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate void ...

    SDK和成员函数作为回调函数demo

    在这个"SDK和成员函数作为回调函数demo"中,我们将深入探讨如何在SDK的上下文中使用成员函数作为回调函数。 首先,SDK中的接口通常是通过函数调用来实现功能的,这些函数可能需要开发者提供一个函数指针,以便在...

    C#委托与C++回调函数处理

    本文将深入探讨C#中的委托以及C++中的回调函数,并阐述如何在C#中处理C++定义的回调函数。 首先,让我们理解C#中的委托。委托在C#中是一种类型安全的事件处理机制,它类似于函数指针,但又有所不同。委托可以引用一...

    C#调C++动态库Dll C++回调C#函数

    这个函数需要接收一个回调函数指针作为参数,这样在执行C++代码时,就可以调用这个回调函数。 - 使用`__declspec(dllexport)`关键字来导出函数。例如: ```cpp extern "C" __declspec(dllexport) void ...

    指针高级应用_虚函数

    这在回调函数、事件处理或者算法封装等方面非常有用。当函数指针与虚函数结合使用时,可以实现更加复杂的动态行为,比如动态调度不同的函数实现。 在“多种指针用法”这部分,我们将探讨包括普通指针、const指针、...

    C++获取类的成员函数的函数指针详解及实例代码

    在C++编程语言中,获取类的成员函数的函数指针是一项重要的技术,它允许我们动态地调用对象的成员函数。下面将详细介绍这一概念,并通过实例代码进行解析。 首先,我们需要理解成员函数指针的概念。成员函数是类的...

    C++回调函数测试例子

    2. **类型安全**:C++不支持函数指针的隐式转换,因此需要确保传递的回调函数与接收函数的签名匹配,否则编译器会报错。 3. **使用场景**:回调函数常用于事件处理(如按钮点击)、算法中的迭代步骤、异步操作完成的...

    C++中的函数指针与函数对象的总结

    在C++编程中,函数指针和函数对象是两种重要的机制,它们允许程序在运行时动态地调用函数,提供了一种灵活的代码组织方式。接下来我们将深入探讨这两个概念。 ### 1. 函数指针 函数指针是C++中的一种特性,它是一...

    Qt使用回调函数方(callback)

    回调函数本质上是一个参数,它本身就是一个可调用的对象,例如函数指针或对象的成员函数。在Qt中,我们可以通过信号和槽机制实现回调,这是一种事件驱动编程模型,当一个信号被触发时,与之连接的槽函数将会被调用。...

    使非mfc窗口程序的窗口回调过程成为c++类的成员函数

    在Windows编程中,MFC(Microsoft Foundation Classes)库提供了一种结构化的方式来创建窗口应用程序,它将窗口回调过程和消息处理封装在C++类中。然而,对于非MFC环境的开发,通常需要使用WinAPI函数来直接操作窗口...

    实例解析C++中类的成员函数指针

    在C++中,成员函数指针是一种特殊的指针类型,它可以指向类的特定成员函数。...理解和熟练使用成员函数指针是提升C++编程技巧的关键,特别是在处理回调、事件处理或需要动态调度成员函数的场景中。

    C++中this指针的用法

    例如,在线程回调函数中,通过传递`this`指针,可以确保每个线程正确地操作属于自己的对象实例。 总结来说,`this`指针在C++中扮演着核心角色,它不仅简化了成员函数内部对对象成员的访问,还提供了额外的安全性和...

    如何让API回调你的VC类成员函数而不是静态函数

    在软件开发过程中,特别是使用C++进行Windows编程时,我们经常会遇到需要将一个类的成员函数作为回调函数传递给某个API(应用程序接口)的情况。然而,由于历史原因和技术限制,大多数API倾向于接受静态函数作为回调...

    C++指针探讨.pdf

    函数指针的一个经典应用场景是作为回调函数的传递。例如,假设有一个排序函数需要用户指定比较逻辑: ```cpp void sort(int *array, size_t count, int (*compare)(const void*, const void*)); ``` 这里的`...

Global site tag (gtag.js) - Google Analytics