首页 > 后端开发 > C++ > 正文

c++怎么实现委托(delegate)_c++委托实现方法

裘德小鎮的故事
发布: 2025-10-11 22:06:01
原创
975人浏览过
C++中可通过std::function与std::bind实现类似C#委托的功能,支持普通函数、成员函数和lambda;使用函数指针适用于简单回调;通过vector存储function对象可实现多播委托;高性能场景可用模板封装零开销委托。

c++怎么实现委托(delegate)_c++委托实现方法

在C++中没有像C#那样的原生委托(delegate)语法,但可以通过多种方式实现类似的功能。委托的核心是“将函数作为参数传递,并支持多播调用”,常见于事件处理、回调机制等场景。以下是几种常用的C++委托实现方法。

使用std::function + std::bind

这是现代C++中最常用且灵活的方式,结合std::functionstd::bind可以轻松实现单播委托。

特点: 支持普通函数、成员函数、lambda表达式,类型安全,语法简洁。

示例代码:

立即学习C++免费学习笔记(深入)”;

#include <functional>
#include <iostream>
#include <vector>
<p>using namespace std;
using namespace std::placeholders;</p><p>void globalFunc(int x) {
cout << "全局函数: " << x << endl;
}</p><p>class MyClass {
public:
void memberFunc(int x) {
cout << "成员函数: " << x << endl;
}
};</p><p>int main() {
// 声明委托
function<void(int)> delegate;</p><pre class='brush:php;toolbar:false;'>// 绑定全局函数
delegate = globalFunc;
delegate(10);

// 绑定成员函数
MyClass obj;
delegate = bind(&MyClass::memberFunc, &obj, _1);
delegate(20);

// 绑定 lambda
delegate = [](int x) { cout << "Lambda: " << x << endl; };
delegate(30);

return 0;
登录后复制

}

使用函数指针(仅限普通函数)

对于简单的函数回调,可以直接使用函数指针,但不支持类成员函数。

适用场景: C风格回调,性能要求高,功能简单。

示例:

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译
void callback(int x) {
    cout << "Callback called with: " << x << endl;
}
<p>using Delegate = void(*)(int);
Delegate del = callback;
del(42);</p>
登录后复制

实现多播委托(Multicast Delegate)

多播委托允许注册多个函数,依次调用。C++标准库没有直接支持,但可以用容器+function实现。

实现思路: 使用vector存储多个function对象,提供add/remove/invoke接口。

class MulticastDelegate {
    vector<function<void(int)>> handlers;
public:
    void add(function<void(int)> func) {
        handlers.push_back(func);
    }
<pre class='brush:php;toolbar:false;'>void invoke(int param) {
    for (auto& h : handlers)
        h(param);
}
登录后复制

};

// 使用示例 MulticastDelegate md; md.add(globalFunc); md.add([](int x){ cout << "Handler 2: " << x << endl; }); md.invoke(50); // 触发所有注册的函数

基于模板的高性能委托(仿FastDelegate)

若对性能要求极高(如游戏引擎),可使用模板+union实现类型安全且无虚函数开销的委托。这类实现通常封装this指针和函数地址。

优点: 零开销抽象,调用速度快。

简化示例(仅供理解原理):

template<typename T>
class FastDelegate {
    using FuncPtr = void(T::*)(int);
    T* obj;
    FuncPtr func;
<p>public:
FastDelegate(T* o, FuncPtr f) : obj(o), func(f) {}</p><pre class='brush:php;toolbar:false;'>void operator()(int x) {
    (obj->*func)(x);
}
登录后复制

};

// 使用 MyClass c; FastDelegate fd(&c, &MyClass::memberFunc); fd(100);

基本上就这些。选择哪种方式取决于需求:日常开发推荐std::function,追求性能可用模板委托,需要多播则自行封装容器。C++的灵活性让委托实现既强大又可控。

以上就是c++++怎么实现委托(delegate)_c++委托实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号