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風格回調更強大和靈活的機制來處理各種可調用對象。
相关推荐
程序员cxuan1 小时前
DeepSeek Harness 必装的插件公布了!
人工智能·后端·程序员
卡卡罗特学AI2 小时前
Codex 百万上下文终于能开了,只要改这 3 行配置
程序员
SamDeepThinking3 小时前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
无责任此方_修行中3 小时前
AI 成本复盘!5 个月后的真实使用情况(附账单)
后端·程序员·ai编程
PC2005_cloud3 小时前
DSH 沙箱机制拆解:受限令牌为何会掐断 HTTPS 请求
前端·程序员
Hilaku4 小时前
高级前端如何优雅地拒绝不合理的产品需求?
前端·javascript·程序员
烬羽4 小时前
nginx 里写 localhost 反而 502?一条请求带你彻底搞懂 Docker 端口映射与反向代理
nginx·docker·程序员
程序员cxuan4 小时前
一招教你在 Codex 中开启 1M 上下文
人工智能·后端·程序员
程序员鱼皮17 小时前
小红书爆了!中美程序员疯狂对账
计算机·程序员·互联网·编程经验
不一样的少年_1 天前
修了 Bug、做了重构,为什么老板还是觉得你没产出?
前端·后端·程序员