C++的函数句柄和回调

在C++中,函数句柄(Function Handle)和回调(Callback)是两种常见的编程技术,用于将函数作为参数传递或在特定事件发生时调用特定的函数。下面我将详细介绍这两种技术。

1. 函数句柄(Function Handle)

函数句柄是指向函数的指针或可调用对象(如lambda表达式、函数对象等)。它允许你将函数作为参数传递给其他函数,或者在运行时动态选择要调用的函数。

1.1 使用函数指针

C++中最基本的函数句柄是函数指针。你可以定义一个指向特定签名的函数的指针,并将其传递给其他函数。

cpp 复制代码
#include <iostream>

void myFunction(int x) {
    std::cout << "Value: " << x << std::endl;
}

void callFunction(void (*func)(int), int value) {
    func(value);
}

int main() {
    callFunction(myFunction, 42);  // 输出: Value: 42
    return 0;
}

1.2 使用std::function

std::function是C++11引入的一个通用的可调用对象包装器,可以存储任何可调用对象(如普通函数、lambda表达式、成员函数等)。

cpp 复制代码
#include <iostream>
#include <functional>

void myFunction(int x) {
    std::cout << "Value: " << x << std::endl;
}

void callFunction(const std::function<void(int)>& func, int value) {
    func(value);
}

int main() {
    callFunction(myFunction, 42);  // 输出: Value: 42

    // 使用lambda表达式
    callFunction([](int x) { std::cout << "Lambda: " << x << std::endl; }, 100);
    
    return 0;
}

2. 回调(Callback)

回调是一种设计模式,通常用于在某个事件发生时执行特定的代码。回调通常通过传递一个回调函数来实现。

2.1 C风格的回调

在C语言中,回调通常通过传递一个指向函数的指针来实现。

cpp 复制代码
#include <iostream>

// Callback function type
typedef void (*Callback)(int);

// Function that accepts a callback
void processData(int data, Callback callback) {
    // Do some processing...
    callback(data); // Call the callback function
}

// Example callback function
void myCallback(int result) {
    std::cout << "Callback result: " << result << std::endl;
}

int main() {
    processData(10, myCallback); // Output: Callback result: 10
    return 0;
}

C++风格的回调

在C++中,你可以使用std::function来实现更灵活的回调机制。

cpp 复制代码
#include <iostream>
#include <functional>

class MyClass {
public:
    void setCallback(const std::function<void(int)>& cb) {
        callback = cb;
    }

    void doSomething() {
        int result = someOperation();
        if (callback) {
            callback(result);
        }
    }

private:
    int someOperation() {
        return 42; // Simulate some operation result
    }

private:
     Function<void(int)> callback; 
};

void myCallback(int result)
{
     Std :: cout<<"Callback Result:"<<result<<std :: endl ;
 }

 Int Main()
{
     MyClass obj ;
     Obj . setcallback (mycallback );
     Obj . dosomething();//Output : Callback Result :42 
     Return0 ;
 }

在这个例子中,"MyClass"类允许设置一个回调函數,"doSomething"方法在执行某些操作后会调用该回調函數。

总结来说:

  • 函數指針和"std :: Function"都可以用来实现函數句柄。
  • 回調是一種設計模式,允許你在特定事件發生時執行代碼。
  • C++中的"std :: Function"提供了比傳統C風格回調更強大和靈活的機制來處理各種可調用對象。
相关推荐
程序员鱼皮2 天前
前特斯拉 AI 总监:AI 编程最大的谎言,是 “提效”
前端·后端·ai·程序员·开发
阿里嘎多学长2 天前
2026-02-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
良许Linux3 天前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
淘源码d5 天前
【开源可商用】高并发智慧校园SaaS平台核心源码:Spring Boot 微服务 + 多终端协同
java·程序员·智慧校园·源码·二次开发·软件源码·电子班牌系统
程序员鱼皮6 天前
7个神级技巧,彻底去除网站的 AI 味儿!
计算机·ai·程序员·互联网·网站·编程经验
程序员鱼皮9 天前
Agent Skills 傻瓜式教程,26 年最火 AI 技术就这?
计算机·ai·程序员·agent·编程经验
黑客-雨11 天前
DeepSeek-V3.2深度拆解:开源模型逆袭,GPT-5迎来劲敌!
人工智能·程序员·大模型·知识图谱·agent·大模型教程·deepseek-v3.2
紫雾凌寒11 天前
【 HarmonyOS 高频题】2026 最新 ArkUI 开发与组件面试题
ui·华为·面试·程序员·职场发展·harmonyos·ark-ui
IT技术分享社区13 天前
GTID 结构升级 + JSON 视图强化,MySQL 9.6 创新版带来哪些性能提升?
数据库·程序员
小阿鑫13 天前
32岁程序员猝死背后,我的一些真实感受
前端·后端·程序员·代码人生