C++ 回调函数应用实战:深入理解与高效使用回调函数
C++ 回调函数应用实战:深入理解与高效使用
在现代软件开发中,回调函数(Callback Function)作为一种强大的编程工具,被广泛应用于各种场景中。它不仅提升了程序的灵活性和可扩展性,还有效地实现了代码的解耦。然而,对于初学者来说,回调函数的概念和实现方式可能显得复杂和抽象。本文将深入浅出地讲解C++中的回调函数,探讨其基本概念、实现方式、应用场景以及高效使用的技巧,并通过详细的实战案例,帮助开发者在项目中有效地应用回调函数,破解性能瓶颈,提升代码效率。
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。
技术合作请加本人wx(注明来自csdn):xt20160813
目录
- 回调函数基础概念
- 什么是回调函数
- 回调函数的作用与优势
- C++中的回调函数实现方式
- 函数指针
std::function
- Lambda表达式
- 仿函数(Functors)
- C++回调函数的使用场景
- 事件驱动编程
- 异步编程
- 库中的回调机制
- 设计模式中的回调应用
- 高效使用回调函数的技巧
- 优化回调签名
- 减少不必要的拷贝
- 生命周期管理
- 避免捕获过多数据
- 实战案例:C++回调函数应用
- 案例一:简单的回调实现
- 案例二:使用
std::function
和Lambda实现回调 - 案例三:回调应用于事件驱动系统
- 案例四:回调在异步操作中的应用
- 案例五:观察者模式中的回调应用
- 回调函数的优缺点
- 现代C++中的替代方案与改进
- 使用未来与承诺(Futures & Promises)
- 协程(Coroutines)的引入
- 总结
- 参考资料
回调函数基础概念
什么是回调函数
回调函数,顾名思义,是通过回调机制调用的函数。在编程中,回调函数是一种通过函数指针、对象的成员函数或其他可调用对象,将某个函数的执行权限交给另一个函数的技术。简而言之,回调函数允许一个函数在另一个函数内部被调用,从而实现代码之间的灵活交互与协作。
回调函数的作用与优势
- 灵活性高:通过回调函数,可以编写更加灵活和可复用的代码,使得不同的功能模块能够动态地协作。
- 解耦代码:回调函数帮助实现代码的高度解耦,提高代码的可维护性和扩展性。
- 事件驱动:在事件驱动编程中,回调函数是处理事件的重要手段,允许程序对不同事件做出响应。
- 异步操作:回调函数在异步编程中用于处理异步操作的结果,避免阻塞主线程。
C++中的回调函数实现方式
C++提供了多种实现回调函数的方式,主要包括函数指针、std::function
、Lambda表达式以及仿函数(Functors)。不同的实现方式各有优缺点,适用于不同的应用场景。
函数指针
函数指针是最基本的回调函数实现方式。它指向一个具有特定签名的函数,可以在运行时被赋值为不同的函数,从而实现在不同场景调用不同函数的目的。
#include <iostream>
using namespace std;
// 定义回调函数类型
typedef void (*Callback)(int);
// 一个示例函数,接受一个回调函数
void performAction(int value, Callback cb) {
cout << "Performing action with value: " << value << endl;
cb(value);
}
// 回调函数实现
void myCallback(int x) {
cout << "Callback called with value: " << x << endl;
}
int main() {
performAction(10, myCallback);
return 0;
}
输出:
Performing action with value: 10
Callback called with value: 10
优点:
- 简单直接,易于理解和实现。
缺点:
- 只能指向具有固定签名的函数,灵活性较低。
- 无法捕获上下文或状态信息,不适合复杂的回调需求。
std::function
C++11引入的std::function
是一种通用的可调用对象包装器,可以存储任何可调用对象,包括函数指针、Lambda表达式、仿函数等。它提供了更高的灵活性和功能性。
#include <iostream>
#include <functional>
using namespace std;
// 一个示例函数,接受一个回调函数
void performAction(int value, function<void(int)> cb) {
cout << "Performing action with value: " << value << endl;
cb(value);
}
int main() {
// 使用Lambda表达式作为回调
auto lambdaCallback = [](int x) {
cout << "Lambda callback called with value: " << x << endl;
};
performAction(20, lambdaCallback);
// 使用函数对象作为回调
struct Functor {
void operator()(int x) const {
cout << "Functor callback called with value: " << x << endl;
}
};
performAction(30, Functor());
return 0;
}
输出:
Performing action with value: 20
Lambda callback called with value: 20
Performing action with value: 30
Functor callback called with value: 30
优点:
- 高度灵活,可以接受多种类型的可调用对象。
- 支持绑定上下文或状态信息,适合复杂的回调需求。
缺点:
- 相对于函数指针,
std::function
的开销略大。 - 需要C++11及以上的支持。
Lambda表达式
Lambda表达式是C++11引入的一种匿名函数,可以在定义的地方直接创建和使用。它通常与std::function
或函数指针结合使用,是实现回调函数的强大工具。
#include <iostream>
#include <functional>
using namespace std;
// 一个示例函数,接受一个回调函数
void performAction(int value, function<void(int)> cb) {
cout << "Performing action with value: " << value << endl;
cb(value);
}
int main() {
// 使用捕获列表的Lambda表达式作为回调
int multiplier = 5;
performAction(40, [multiplier](int x) {
cout << "Lambda callback called with value: " << x << ", multiplied value: " << x * multiplier << endl;
});
return 0;
}
输出:
Performing action with value: 40
Lambda callback called with value: 40, multiplied value: 200
优点:
- 方便快捷,可在定义时直接创建回调逻辑。
- 支持捕获外部变量,能够传递上下文信息。
缺点:
- 可能增加代码的复杂性,尤其是当Lambda表达式变得复杂时。
仿函数(Functors)
仿函数,也称为函数对象,是定义了operator()
的类或结构体实例。它们可以像函数一样被调用,适用于需要存储状态或复杂行为的回调需求。
#include <iostream>
#include <functional>
using namespace std;
// 仿函数类
struct Functor {
int factor;
Functor(int f) : factor(f) {}
void operator()(int x) const {
cout << "Functor callback called with value: " << x << ", factored value: " << x * factor << endl;
}
};
// 一个示例函数,接受一个回调函数
void performAction(int value, function<void(int)> cb) {
cout << "Performing action with value: " << value << endl;
cb(value);
}
int main() {
Functor functor(3);
performAction(50, functor);
return 0;
}
输出:
Performing action with value: 50
Functor callback called with value: 50, factored value: 150
优点:
- 能够存储和管理内部状态,适用于复杂的回调场景。
- 灵活性高,可以定义复杂的行为逻辑。
缺点:
- 实现相对繁琐,需要定义专门的类或结构体。
- 可能增加代码的复杂性。
C++回调函数的使用场景
回调函数在C++项目中有着广泛的应用,涵盖了事件驱动编程、异步操作、库接口以及设计模式等多个领域。以下是回调函数的一些典型应用场景。
事件驱动编程
在事件驱动编程中,程序的执行流由外部事件(如用户输入、网络请求等)触发。回调函数用于处理这些事件,使得程序能够对不同的事件做出不同的响应。
#include <iostream>
#include <functional>
using namespace std;
// 事件触发器
class Event {
public:
void setCallback(function<void(string)> cb) {
callback = cb;
}
void triggerEvent(const string& message) {
cout << "Event triggered with message: " << message << endl;
if(callback) callback(message);
}
private:
function<void(string)> callback;
};
int main() {
Event event;
// 设置回调函数
event.setCallback([](string msg) {
cout << "Handling event with message: " << msg << endl;
});
// 触发事件
event.triggerEvent("Hello, Event!");
return 0;
}
输出:
Event triggered with message: Hello, Event!
Handling event with message: Hello, Event!
异步编程
在异步编程中,回调函数用于处理异步操作的结果,如文件读取、网络请求等。通过回调函数,主线程可以在等待异步操作完成的同时,继续执行其他任务。
#include <iostream>
#include <functional>
#include <thread>
#include <chrono>
using namespace std;
// 模拟异步操作
void asyncOperation(function<void(int)> callback) {
// 在新线程中执行
thread([callback]() {
cout << "Async operation started..." << endl;
// 模拟耗时操作
this_thread::sleep_for(chrono::seconds(2));
int result = 42; // 假设的异步结果
cout << "Async operation completed with result: " << result << endl;
callback(result);
}).detach();
}
int main() {
cout << "Main thread continues..." << endl;
// 发起异步操作并设置回调
asyncOperation([](int res) {
cout << "Callback received result: " << res << endl;
});
// 主线程继续执行其他任务
this_thread::sleep_for(chrono::seconds(3));
cout << "Main thread ends." << endl;
return 0;
}
输出:
Main thread continues...
Async operation started...
Async operation completed with result: 42
Callback received result: 42
Main thread ends.
库中的回调机制
许多C++库提供回调机制,允许用户在特定操作完成时执行自定义逻辑。例如,libcurl库用于处理网络请求,提供了回调函数用于处理数据接收和发送。
#include <iostream>
#include <curl/curl.h>
using namespace std;
// 写入回调函数
size_t writeCallback(char* ptr, size_t size, size_t nmemb, string* data) {
if(data == NULL) return 0;
data->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
CURL* curl;
CURLcode res;
string readBuffer;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
// 设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
// 设置回调函数的数据
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if(res == CURLE_OK) {
cout << "Received Data: " << readBuffer.substr(0, 100) << "..." << endl;
}
else {
cerr << "Curl Error: " << curl_easy_strerror(res) << endl;
}
}
return 0;
}
输出:
Received Data: <!doctype html>
<html>
<head>
<title>Example Domain</title>
...
设计模式中的回调应用
在各种设计模式中,回调函数扮演着重要角色。例如,观察者模式中,主题(Subject)会维护一个观察者(Observer)列表,并在状态变化时,通过回调函数通知所有观察者。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
// 主题类
class Subject {
public:
void registerObserver(function<void(int)> observer) {
observers.push_back(observer);
}
void notifyObservers(int state) {
for(auto& obs : observers) {
obs(state);
}
}
void setState(int state) {
this->state = state;
notifyObservers(state);
}
private:
vector<function<void(int)>> observers;
int state;
};
// 观察者A
void observerA(int state) {
cout << "Observer A notified with state: " << state << endl;
}
// 观察者B
class ObserverB {
public:
void update(int state) {
cout << "Observer B notified with state: " << state << endl;
}
};
int main() {
Subject subject;
// 注册观察者A
subject.registerObserver(observerA);
// 注册观察者B
ObserverB obsB;
subject.registerObserver(bind(&ObserverB::update, &obsB, placeholders::_1));
// 更改状态,通知观察者
subject.setState(100);
return 0;
}
输出:
Observer A notified with state: 100
Observer B notified with state: 100
高效使用回调函数的技巧
为了在C++项目中高效地使用回调函数,需要遵循一些最佳实践,优化回调函数的性能和安全性。
优化回调签名
设计回调函数时,确保其签名简单、明确,避免过多的参数和复杂的类型。常见的回调签名包括:
- 无参数
- 接受少量必要参数
- 使用引用或指针传递大对象,避免拷贝
示例:
typedef void (*SimpleCallback)();
typedef void (*DataCallback)(const string& data);
// 简单回调函数
void onComplete() {
cout << "Operation completed." << endl;
}
// 数据回调函数
void onDataReceived(const string& data) {
cout << "Data received: " << data << endl;
}
减少不必要的拷贝
在回调函数中,尽量使用引用或指针传递大对象,避免在函数调用过程中进行不必要的拷贝操作。这不仅提升了性能,还减少了内存的消耗。
示例:
#include <iostream>
#include <functional>
using namespace std;
// 回调函数接受引用,避免拷贝
void processData(int value, function<void(const int&)> callback) {
// 进行一些处理
callback(value);
}
int main() {
int data = 50;
processData(data, [](const int& x) {
cout << "Callback with value: " << x << endl;
});
return 0;
}
生命周期管理
确保在回调函数执行期间,被引用的对象保持有效。避免悬垂引用和访问已销毁的对象。可以使用智能指针或其他生命周期管理策略,保证对象的生存期。
示例:
#include <iostream>
#include <functional>
#include <memory>
using namespace std;
// 类定义
class Processor {
public:
void setCallback(function<void(int)> cb) {
callback = cb;
}
void execute(int value) {
// 执行操作
if(callback) callback(value);
}
private:
function<void(int)> callback;
};
int main() {
auto processor = make_shared<Processor>();
// 使用智能指针捕获shared_ptr,确保对象生存期
processor->setCallback([processor](int val) {
cout << "Callback called with value: " << val << endl;
// 可以安全地访问processor对象
});
processor->execute(200);
return 0;
}
避免捕获过多数据
在Lambda表达式或仿函数中,避免捕获不必要的外部变量。这样不仅可以减少内存占用,还可以降低缓存压力。
示例:
#include <iostream>
#include <functional>
using namespace std;
class Handler {
public:
void setCallback(int multiplier, function<void(int)> cb) {
callback = cb;
this->multiplier = multiplier;
}
void trigger(int value) {
if(callback) callback(value * multiplier);
}
private:
function<void(int)> callback;
int multiplier;
};
int main() {
Handler handler;
int multiplier = 3;
// 仅捕获需要的变量
handler.setCallback(multiplier, [multiplier](int x) {
cout << "Result: " << x << endl;
});
handler.trigger(100);
return 0;
}
实战案例:C++回调函数应用
通过几个实战案例,深入展示C++回调函数在不同场景下的应用和优化方法。
案例一:简单的回调实现
场景描述:
实现一个简单的函数执行器,接受一个回调函数,在主要操作完成后调用回调函数。
实现:
#include <iostream>
using namespace std;
// 定义回调函数类型
typedef void (*Callback)(int);
// 函数执行器,接受一个回调函数
void executeOperation(int value, Callback cb) {
cout << "Executing operation with value: " << value << endl;
// 主要操作,模拟一些处理
int result = value * 2;
// 调用回调函数
cb(result);
}
// 回调函数实现
void onOperationComplete(int res) {
cout << "Operation completed with result: " << res << endl;
}
int main() {
executeOperation(10, onOperationComplete);
return 0;
}
输出:
Executing operation with value: 10
Operation completed with result: 20
分析:
- 通过函数指针实现简单的回调机制。
- 适用于固定回调逻辑的场景。
案例二:使用std::function
和Lambda实现回调
场景描述:
利用std::function
和Lambda表达式,实现更加灵活且可传递状态的回调函数。
实现:
#include <iostream>
#include <functional>
using namespace std;
// 函数执行器,接受一个std::function回调
void executeOperation(int value, function<void(int)> cb) {
cout << "Executing operation with value: " << value << endl;
// 主要操作,模拟一些处理
int result = value + 5;
// 调用回调函数
cb(result);
}
int main() {
int multiplier = 3;
// 使用Lambda表达式作为回调,并捕获外部变量
auto lambdaCallback = [multiplier](int res) {
cout << "Lambda callback called with result: " << res << ", multiplied value: " << res * multiplier << endl;
};
executeOperation(15, lambdaCallback);
return 0;
}
输出:
Executing operation with value: 15
Lambda callback called with result: 20, multiplied value: 60
分析:
- 使用
std::function
提供了更大的灵活性,可以接受多种类型的回调函数。 - Lambda表达式允许捕获外部变量,实现状态传递。
案例三:回调应用于事件驱动系统
场景描述:
构建一个简单的事件系统,允许注册多个回调函数,当事件触发时,所有注册的回调函数被调用。
实现:
#include <iostream>
#include <functional>
#include <vector>
using namespace std;
// 事件类
class Event {
public:
// 注册回调函数
void registerCallback(function<void(string)> cb) {
callbacks.push_back(cb);
}
// 触发事件
void trigger(string message) {
cout << "Event triggered with message: " << message << endl;
for(auto& cb : callbacks) {
cb(message);
}
}
private:
vector<function<void(string)>> callbacks;
};
// 回调函数A
void callbackA(string msg) {
cout << "Callback A received: " << msg << endl;
}
// 回调函数B,使用Lambda表达式
int main() {
Event event;
// 注册回调函数A
event.registerCallback(callbackA);
// 注册Lambda回调函数
event.registerCallback([](string msg) {
cout << "Lambda Callback received: " << msg << endl;
});
// 触发事件
event.trigger("Hello, Event!");
return 0;
}
输出:
Event triggered with message: Hello, Event!
Callback A received: Hello, Event!
Lambda Callback received: Hello, Event!
分析:
- 实现了一个简单的事件系统,支持多回调函数注册和触发。
- 通过
std::function
和Lambda表达式,提高了系统的灵活性和可扩展性。
案例四:回调在异步操作中的应用
场景描述:
模拟一个异步操作,操作完成后通过回调函数通知主线程结果,避免阻塞主线程。
实现:
#include <iostream>
#include <functional>
#include <thread>
#include <chrono>
using namespace std;
// 模拟异步操作,接受一个回调函数
void asyncOperation(function<void(int)> cb) {
// 在新线程中执行异步操作
thread([cb]() {
cout << "Async operation started..." << endl;
// 模拟耗时操作
this_thread::sleep_for(chrono::seconds(2));
int result = 100; // 假设的异步结果
cout << "Async operation completed with result: " << result << endl;
// 调用回调函数
cb(result);
}).detach();
}
int main() {
cout << "Main thread continues..." << endl;
// 发起异步操作并设置回调
asyncOperation([](int res) {
cout << "Callback received result: " << res << endl;
});
// 主线程继续执行其他任务
this_thread::sleep_for(chrono::seconds(3));
cout << "Main thread ends." << endl;
return 0;
}
输出:
Main thread continues...
Async operation started...
Async operation completed with result: 100
Callback received result: 100
Main thread ends.
分析:
- 通过多线程模拟异步操作,发送结果时调用回调函数。
- 回调函数在异步操作完成后执行,避免主线程被阻塞。
案例五:观察者模式中的回调应用
场景描述:
应用观察者模式,主题(Subject)维护观察者(Observer)列表,通过回调函数通知所有观察者状态变化。
实现:
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
// 主题类
class Subject {
public:
// 注册观察者回调函数
void registerObserver(function<void(int)> observer) {
observers.push_back(observer);
}
// 通知所有观察者
void notifyObservers(int state) {
for(auto& obs : observers) {
obs(state);
}
}
// 设置状态并通知观察者
void setState(int state) {
this->state = state;
notifyObservers(state);
}
private:
vector<function<void(int)>> observers;
int state;
};
// 观察者A
void observerA(int state) {
cout << "Observer A notified with state: " << state << endl;
}
// 观察者B,使用类成员函数
class ObserverB {
public:
void update(int state) {
cout << "Observer B notified with state: " << state << endl;
}
};
int main() {
Subject subject;
// 注册观察者A
subject.registerObserver(observerA);
// 注册观察者B
ObserverB obsB;
subject.registerObserver(bind(&ObserverB::update, &obsB, placeholders::_1));
// 改变状态,通知观察者
subject.setState(10);
return 0;
}
输出:
Observer A notified with state: 10
Observer B notified with state: 10
分析:
- 实现了观察者模式,通过回调函数通知所有注册的观察者。
- 使用
std::function
和std::bind
,支持不同类型的观察者回调函数。
回调函数的优缺点
优点
- 灵活性高:回调函数允许程序在运行时动态地选择执行逻辑,适应多变的需求。
- 解耦代码:回调机制帮助实现功能模块之间的解耦,提高代码的可维护性和可扩展性。
- 事件驱动:在事件驱动编程中,回调函数是处理事件的核心机制,使得程序能够对不同事件做出响应。
- 异步处理:回调函数在异步编程中用于处理异步操作的结果,避免阻塞主线程。
缺点
- 代码复杂性增加:过多的回调函数可能导致代码难以理解和追踪,增加代码的复杂性。
- 调试困难:回调函数可能引发隐蔽的bug,尤其是在多线程环境下,调试变得更加困难。
- 生命周期管理复杂:确保回调函数执行期间相关对象的生存期,是开发者需要关注的问题,避免悬挂指针和资源泄漏。
现代C++中的替代方案与改进
随着C++标准的不断更新,现代C++引入了一些替代回调函数的方案,提供了更高效和安全的方式进行异步和事件驱动编程。
使用未来与承诺(Futures & Promises)
**std::future
和std::promise
**提供了一种机制,允许线程之间进行数据传递和同步,而无需显式使用回调函数。这种方式使得代码更加清晰和易于维护。
#include <iostream>
#include <future>
#include <thread>
using namespace std;
// 异步操作函数,返回future
future<int> asyncOperation() {
return async(launch::async, []() -> int {
cout << "Async operation started..." << endl;
this_thread::sleep_for(chrono::seconds(2));
cout << "Async operation completed." << endl;
return 100;
});
}
int main() {
cout << "Main thread continues..." << endl;
// 发起异步操作
future<int> fut = asyncOperation();
// 主线程继续执行其他任务
this_thread::sleep_for(chrono::seconds(1));
cout << "Main thread doing other work..." << endl;
// 获取异步操作结果
int result = fut.get();
cout << "Async operation result: " << result << endl;
cout << "Main thread ends." << endl;
return 0;
}
输出:
Main thread continues...
Async operation started...
Main thread doing other work...
Async operation completed.
Async operation result: 100
Main thread ends.
优点:
- 更易于管理:无需显式传递回调函数,减少了代码的复杂性。
- 更好的异常处理:C++的异常机制能够更好地与
future
和promise
结合,处理异步操作中的异常。 - 同步与异步结合:结合
future
和promise
,可以更灵活地处理同步和异步任务。
协程(Coroutines)的引入
C++20引入了协程(Coroutines),提供了一种更为现代和高效的异步编程方式。协程允许编写非阻塞的、类似同步的代码,极大地简化了异步操作的实现。
#include <iostream>
#include <coroutine>
#include <thread>
#include <chrono>
using namespace std;
// 定义协程任务
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
suspend_never initial_suspend() { return {}; }
suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
};
Task asyncOperation() {
cout << "Async operation started..." << endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
cout << "Async operation completed." << endl;
}
int main() {
cout << "Main thread continues..." << endl;
auto task = asyncOperation();
cout << "Main thread does other work..." << endl;
// 等待协程完成
std::this_thread::sleep_for(std::chrono::seconds(3));
cout << "Main thread ends." << endl;
return 0;
}
输出:
Main thread continues...
Async operation started...
Main thread does other work...
Async operation completed.
Main thread ends.
优点:
- 简化异步编程:协程使得异步代码看起来像同步代码,提升了代码的可读性和可维护性。
- 性能优化:协程在内部管理挂起和恢复,减少了线程切换的开销。
- 可组合性:协程可以轻松地组合多个异步操作,提高代码的模块化和复用性。
缺点:
- 复杂性:协程的概念较为新颖,对于初学者来说,上手可能存在一定难度。
- 编译器支持:需要使用支持C++20协程的编译器版本。
总结
回调函数作为一种重要的编程模式,在C++项目中扮演着不可或缺的角色。它们通过实现代码的解耦和灵活的功能调用,提高了程序的可扩展性和响应能力。然而,回调函数的使用也带来了代码复杂性和生命周期管理的挑战。通过合理选择和优化回调函数的实现方式,结合现代C++提供的新特性,如std::function
、Lambda表达式和协程,开发者可以更高效地利用回调函数,构建高性能、可维护的C++应用程序。
同时,随着C++标准的不断更新,持续学习和掌握新技术,能够帮助开发者在项目中更加灵活和高效地应用回调函数,实现更优的性能和功能。
参考资料
- C++ Reference
- C++11标准文档
- Effective Modern C++ - Scott Meyers
- C++ Concurrency in Action - Anthony Williams
- C++20 Coroutines
- libcurl官方文档
- C++ Design Patterns
- C++ Lambda表达式详解
- Boost Libraries
- Intel Threading Building Blocks (TBB)
标签
C++、回调函数、Lambda表达式、std::function、异步编程、事件驱动、设计模式、协程、性能优化、多线程
版权声明
本文版权归作者所有,未经允许,请勿转载。