如何编写可复用函数并动态切换if判断条件?
函数多条件调用的复用实现方案
下面提供几种可行的实现方式,按推荐程度排序:
1. 传入条件判断回调(最推荐)
把判断逻辑封装成可调用对象(函数指针、lambda等)作为参数传给目标函数,让函数只负责执行核心逻辑,条件判断由外部传入,完全解耦。
C++ 示例(用Lambda)
#include <functional> // 核心函数,接受一个判断条件的回调 void processLogic(const std::function<bool()>& checkCondition) { if (checkCondition()) { // 这里写你需要复用的核心逻辑 // 比如:printf("符合条件,执行操作\n"); } } // 调用位置1:传入年龄和酒精含量的判断逻辑 processLogic([&]() { return age >= 18 && alcohol_consumed < 0.2; }); // 调用位置2:传入身高和财富的判断逻辑 processLogic([&]() { return height_m >= 1.82 && is_rich == true; });
C 示例(用函数指针)
#include <stdbool.h> // 定义条件判断的函数指针类型 typedef bool (*ConditionChecker)(void); // 核心函数 void processLogic(ConditionChecker checker) { if (checker()) { // 核心逻辑代码 } } // 针对场景1的判断函数(需确保age、alcohol_consumed可访问,比如全局变量或通过参数传递) bool checkAgeAlcohol(void) { return age >= 18 && alcohol_consumed < 0.2; } // 针对场景2的判断函数 bool checkHeightWealth(void) { return height_m >= 1.82 && is_rich == true; } // 调用 processLogic(checkAgeAlcohol); processLogic(checkHeightWealth);
2. 用枚举标记分支判断
如果不想用回调,可以定义枚举标记调用场景,在函数内部根据枚举值选择对应的条件判断。这种方式适合条件较少且不频繁变更的场景。
typedef enum { SCENE_AGE_ALCOHOL, SCENE_HEIGHT_WEALTH } CallScene; void processLogic(CallScene scene) { bool isQualified = false; switch(scene) { case SCENE_AGE_ALCOHOL: isQualified = (age >= 18 && alcohol_consumed < 0.2); break; case SCENE_HEIGHT_WEALTH: isQualified = (height_m >= 1.82 && is_rich == true); break; default: isQualified = false; } if (isQualified) { // 核心逻辑 } } // 调用 processLogic(SCENE_AGE_ALCOHOL); processLogic(SCENE_HEIGHT_WEALTH);
3. 正确使用宏定义(不推荐,仅作参考)
你之前失败是因为误用了#if(这是预处理阶段的条件编译,不是运行时判断)。可以直接把条件作为宏参数传入,实现代码复用,但宏的可读性和安全性较差,不建议在大型项目中使用:
#define PROCESS_LOGIC(condition) \ do { \ if (condition) { \ // 核心逻辑代码 \ } \ } while(0) // 调用位置1 PROCESS_LOGIC(age >= 18 && alcohol_consumed < 0.2); // 调用位置2 PROCESS_LOGIC(height_m >= 1.82 && is_rich == true);
do-while(0)的作用是避免宏展开后出现语法错误(比如在if语句后直接调用宏时的分号问题)。
内容的提问来源于stack exchange,提问作者Mr.Barbo
相关产品推荐
相关产品推荐

