C++如何创建绑定不同对象的成员函数指针数组?
C++ 将不同类的成员函数绑定后存入数组的实现方案
实现可行性
完全可以实现该需求,核心思路是通过可调用对象包装器,将成员函数和对应实例绑定为统一签名的可调用对象,再存入数组。
具体实现代码
基础依赖
需要引入C++11及以上版本提供的<functional>头文件,数组可以选择std::array(固定大小)或std::vector(动态大小)。
完整示例
#include <functional> #include <array> class A { public: void foo(int i) { // 函数实现逻辑 } }; class B { public: void bar(int i) { // 函数实现逻辑 } }; int main() { A objectA; B objectB; // 方案1:使用lambda表达式绑定,可读性更高 std::array<std::function<void(int)>, 2> arr = { [&objectA](int arg) { objectA.foo(arg); }, [&objectB](int arg) { objectB.bar(arg); } }; // 方案2:使用std::bind绑定 // std::array<std::function<void(int)>, 2> arr = { // std::bind(&A::foo, &objectA, std::placeholders::_1), // std::bind(&B::bar, &objectB, std::placeholders::_1) // }; // 按需求调用 arr[0](10); arr[1](20); return 0; }
效率说明
- 常规实现(基于
std::function)的开销极小,仅相当于1次虚函数调用的成本,绝大多数业务场景下完全感知不到性能损耗,只有在单线程每秒调用次数达到千万级以上的热路径中才需要考虑优化。 - 如果追求零开销,可以用
std::tuple存储绑定后的lambda对象,调用时通过编译期常量下标访问,性能和直接调用原成员函数完全一致,但缺点是无法使用运行时动态下标选择调用的函数。
注意事项
示例中使用引用捕获实例,需要保证objectA、objectB的生命周期长于数组arr的使用周期,避免出现悬空引用问题。如果实例生命周期无法保证,可以修改为值捕获,或使用智能指针持有实例后再绑定。
内容的提问来源于stack exchange,提问作者Agiltohr
相关产品推荐
相关产品推荐

