如何用if语句判断变量是否等于命名空间中任意元素?
解决思路
当命名空间里的元素太多,逐个写||判断太麻烦时,这几个方法能帮你简化代码:
1. 把元素放进容器,用标准库算法检查
把命名空间里的所有常量统一存到一个容器(比如vector或array)里,之后用std::any_of来判断变量是否在容器中。后续新增元素只需要往容器里加,不用修改判断逻辑。
代码示例:
#include <algorithm> #include <vector> namespace A { int FOO = 1; int BAR = 2; int BAZ = 3; // 加新元素直接在这补就行 } // 一次性收集所有命名空间元素 const std::vector<int> A_all_values = {A::FOO, A::BAR, A::BAZ}; int main() { int test = 2; if (std::any_of(A_all_values.begin(), A_all_values.end(), [test](int val) { return val == test; })) { // 匹配成功后的逻辑 } }
如果追求性能,用std::array代替vector更合适,编译期就能确定容器大小,没有动态内存开销。
2. 编译期常量检查(适合C++11及以上)
如果命名空间里的元素都是编译期常量(用constexpr修饰),可以写个constexpr函数在编译期完成判断,完全不占运行时开销。
代码示例:
namespace A { constexpr int FOO = 1; constexpr int BAR = 2; constexpr int BAZ = 3; } // 编译期数组存所有元素 constexpr int A_values[] = {A::FOO, A::BAR, A::BAZ}; constexpr size_t A_count = sizeof(A_values) / sizeof(A_values[0]); // 编译期判断函数 constexpr bool is_in_A(int test_val) { for (size_t i = 0; i < A_count; ++i) { if (A_values[i] == test_val) { return true; } } return false; } int main() { constexpr int test = 2; // 结果在编译时就确定了 if (is_in_A(test)) { // 匹配逻辑 } }
3. C++20 简洁写法
C++20引入了范围库,可以直接用std::ranges::any_of配合初始化列表,代码更短:
#include <ranges> #include <algorithm> namespace A { int FOO = 1; int BAR = 2; int BAZ = 3; } int main() { int test = 3; if (std::ranges::any_of({A::FOO, A::BAR, A::BAZ}, [test](int val) { return val == test; })) { // 匹配成功 } }
额外建议:用枚举替代命名空间散量
如果这些元素是一组相关的常量,更推荐用enum class(强类型枚举)替代命名空间里的独立变量,类型更安全,维护也方便:
#include <algorithm> #include <array> enum class A { FOO = 1, BAR = 2, BAZ = 3 }; constexpr std::array<A, 3> A_values = {A::FOO, A::BAR, A::BAZ}; int main() { int test = 2; if (std::any_of(A_values.begin(), A_values.end(), [test](A val) { return static_cast<int>(val) == test; })) { // 匹配逻辑 } }
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

