函数指针数组可实现动态调用与回调机制,如菜单系统中通过索引调用对应函数:定义FuncPtr数组存储add、sub函数地址,利用下标0或1调用相应函数,实现运行时根据条件选择执行逻辑。

在C++中,函数指针数组是一种强大的工具,能够实现动态调用和回调机制。它允许程序在运行时根据条件选择并执行不同的函数,广泛应用于事件处理、插件系统、状态机等场景。
函数指针的基本概念
函数指指针指向函数的入口地址,可以通过指针调用函数。定义方式如下:
// 定义一个函数指针类型 typedef int (*FuncPtr)(int, int);// 示例函数 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; }
// 使用函数指针 FuncPtr ptr = add; int result = ptr(3, 4); // 调用add(3, 4)
函数指针的类型必须与目标函数的返回值和参数列表完全匹配。
函数指针数组的定义与初始化
将多个函数指针组织成数组,可实现批量管理和动态索引调用。
立即学习“C++免费学习笔记(深入)”;
// 定义函数指针数组
FuncPtr funcArray[] = {add, sub};
// 调用数组中的函数
int result1 = funcArray[0](5, 3); // 调用add
int result2 = funcArray[1](5, 3); // 调用sub
数组元素是函数名(即函数地址),编译器会自动转换为对应类型的指针。
实现函数回调机制
函数指针数组常用于实现回调。例如,在菜单系统中,每个选项对应一个函数:
void save() { cout << "保存文件\n"; }
void open() { cout << "打开文件\n"; }
void exitApp() { cout << "退出程序\n"; }
// 回调函数指针数组
void (*menuActions[])() = {save, open, exitApp};
// 动态调用
int choice = 1;
if (choice >= 0 && choice < 3) {
menuActions[choice](); // 根据用户输入执行
}
这种结构解耦了用户输入与具体操作,便于扩展和维护。
结合std::function实现更灵活的调用
C++11引入的std::function支持更通用的可调用对象,包括普通函数、lambda、绑定表达式等。
#include#include using Callback = std::function
; std::vector callbacks; callbacks.push_back([](){ cout << "任务1完成\n"; }); callbacks.push_back(save); callbacks.push_back([](int x){ cout << "进度: " << x << "%\n"; }); // 需适配
// 调用 for (auto& cb : callbacks) { if (cb) cb(); }
注意:lambda捕获列表或不同签名需统一包装,否则无法存入同一容器。
基本上就这些。掌握函数指针数组,能让你写出更灵活、模块化的C++代码。尤其在需要运行时决策调用哪个函数时,这种技巧非常实用。不复杂但容易忽略细节,比如类型匹配和数组越界检查。










