您的位置 首页 编程知识

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

C++中可通过std::function与std::bind实现类似C#委托的功能,支持普通函数、成员函数和l…


C++中可通过std::function与std::bind实现类似C#委托的功能,支持普通函数、成员函数和lambda;使用函数指针适用于简单回调;通过vector存储function对象可实现多播委托;高性能场景可用模板封装零开销委托。

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

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

使用std::function + std::bind

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

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

示例代码:

立即学习“”;

 #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风格回调,性能要求高,功能简单。

示例:

 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实现。

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

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

实现思路: 使用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++的灵活性让委托实现既强大又可控。

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

相关标签:

大家都在看:

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/15505.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部