C++类中如何根据初始化阶数为函数指针绑定对应多项式求解函数
方案实现:用静态函数指针数组做阶数到求解函数的映射
这是最适配你场景的实现方式,刚好可以配合Matlab代码生成脚本完成全自动化,不需要手动编写任何分支逻辑:
步骤1:定义函数指针类型与全局映射表
首先提前定义统一的函数指针类型,再声明一个大小匹配最高阶数的静态数组,数组下标直接对应多项式阶数:
// 放在头文件全局作用域,或者Polynomial类的静态成员位置 const int MAX_POLY_ORDER = 50; using SolveFuncType = double (*)(Polynomial*, vec, vec); static SolveFuncType funTable[MAX_POLY_ORDER + 1] = {nullptr};
步骤2:配合Matlab生成脚本自动填充映射表
你在Matlab脚本生成someFunPolyN函数的同时,额外生成映射表的初始化代码即可,比如你循环生成2到50阶的函数时,每生成一个函数就同步输出一行初始化语句:
// 这部分全部由Matlab脚本自动生成,不需要手动编写 void initFunTable() { funTable[2] = &someFunPoly2; funTable[3] = &someFunPoly3; funTable[4] = &someFunPoly4; // ... 自动生成到50阶 funTable[50] = &someFunPoly50; }
程序启动时调用一次initFunTable()完成表的初始化即可。
步骤3:修改Polynomial构造函数的绑定逻辑
原来的一堆if分支直接替换为一行下标查找即可,可额外加边界校验避免非法阶数:
Polynomial(int order_) { if (order_ < 2 || order_ > MAX_POLY_ORDER) { // 这里可以加异常抛出或者默认赋值逻辑 throw std::invalid_argument("多项式阶数仅支持2~50"); } order = order_; n = order + 1; p = new double[n]; for (int i = 0; i < n; i++) p[i] = 0.0; // 一行完成函数绑定,无需任何分支 SolveFun = funTable[order_]; }
可选优化:无需全局初始化函数的实现
如果使用C++17及以上版本,可以把映射表做成Polynomial类的内联静态成员,在类内直接完成初始化,不需要单独调用初始化函数,代码更简洁。
内容的提问来源于stack exchange,提问作者rinkert
相关产品推荐
相关产品推荐

