如何遍历C++命名空间内所有函数以获取有效strategyType枚举值
解决方案
由于命名空间allFunctionStrategy中的函数参数列表各异,但strategyContext类已持有所有调用这些函数所需的参数,我们可以通过统一调用接口的方式实现遍历逻辑,具体步骤如下:
核心思路
将每个策略函数包装为无参可调用对象(利用lambda捕获类成员变量),存入容器后逐个调用,直到找到第一个返回非InvalidStrategy的结果。
代码实现
修改strategyContext类,添加遍历逻辑的成员函数:
#include <vector> #include <functional> #include <string> enum class strategyType { Strategy1, Strategy2, Strategy3, Strategy4, Strategy5, InvalidStrategy }; namespace allFunctionStrategy { strategyType algorithmMl(int v1,int v2); strategyType algorithmHeuristic(int v3,std::string s1); strategyType algorithmHeuristic(std::string s1,std::string s2); // 其他策略函数声明 } class strategyContext { int v1,v2,v3; std::string s1,s2; // 预存所有包装后的策略函数(提升重复调用效率) std::vector<std::function<strategyType()>> strategyFuncs; public: // 构造函数:初始化成员变量并预包装策略函数 strategyContext(int v1_, int v2_, int v3_, std::string s1_, std::string s2_) : v1(v1_), v2(v2_), v3(v3_), s1(s1_), s2(s2_) { // 将每个策略函数绑定为无参调用 strategyFuncs = { [this]() { return allFunctionStrategy::algorithmMl(v1, v2); }, [this]() { return allFunctionStrategy::algorithmHeuristic(v3, s1); }, [this]() { return allFunctionStrategy::algorithmHeuristic(s1, s2); } // 新增策略函数时,直接在此添加对应的lambda即可 }; } // 遍历策略函数,返回第一个有效结果 strategyType getValidStrategy() { for (const auto& func : strategyFuncs) { strategyType result = func(); if (result != strategyType::InvalidStrategy) { return result; } } // 所有函数均返回无效值时,返回默认无效枚举 return strategyType::InvalidStrategy; } };
关键细节说明
- 统一接口:借助
std::function<strategyType()>消除不同策略函数的参数差异,lambda表达式捕获当前类的成员变量,完成参数绑定。 - 扩展性:新增策略函数时,仅需在
strategyFuncs的初始化列表中添加对应lambda,无需修改遍历逻辑。 - 效率优化:将策略函数容器设为类成员变量,在构造函数中初始化,避免每次调用
getValidStrategy时重复创建容器。
内容的提问来源于stack exchange,提问作者nutNCracker
相关产品推荐
相关产品推荐

