You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过oatpp::Type对象自动获取枚举的描述与数值?

Oat++自动收集枚举文档:获取枚举值与描述的方案

你可以通过Oat++的运行时反射机制,结合ENUM宏自动生成的静态方法,无需硬编码枚举类型就能获取所有枚举项的数值、名称和描述信息,具体实现步骤如下:

1. 核心原理

Oat++的ENUM宏会为每个枚举类型生成静态方法getValues(),该方法返回包含所有枚举项详细信息的集合,每个枚举项包含value(数值)、name(字符串标识)、description(描述)三个字段。通过运行时反射,我们可以从const oatpp::Type *type对象关联的类信息中调用这个静态方法。

2. 实现代码示例

#include "oatpp/core/Types.hpp"
#include "oatpp/core/runtime/classid/ClassId.hpp"
#include "oatpp/core/log/Logger.hpp"

void collectEnumInfo(const oatpp::Type* type) {
    // 判断当前类型是否为枚举类型
    if (type->isEnum()) {
        auto classInfo = oatpp::runtime::classid::getClassInfo(type->classId);
        if (classInfo) {
            // 调用枚举类的静态getValues()方法
            auto valuesAny = classInfo->invokeStaticMethod<oatpp::Any>("getValues");
            auto enumValues = oatpp::cast<oatpp::Vector<oatpp::Any>>(valuesAny);
            
            // 遍历所有枚举项,提取信息
            for (const auto& item : enumValues) {
                auto valueObj = item.objectPtr();
                auto value = valueObj->getField<oatpp::Any>("value");
                auto name = valueObj->getField<oatpp::String>("name");
                auto description = valueObj->getField<oatpp::String>("description");
                
                OATPP_LOGD("EnumInfo", "数值: %s, 标识: %s, 描述: %s", 
                          value.toString()->c_str(), 
                          name->c_str(), 
                          description->c_str());
            }
        }
    }
}

3. 注意事项

  • 确保项目编译时启用了Oat++的运行时反射:需定义宏OATPP_RUNTIME_REFLECTION_ENABLED=1(通常在CMakeLists.txt或编译选项中配置)。
  • 该方案适配所有通过ENUM宏定义的枚举,无论其底层数值类型(如v_int32、v_uint64等),无需针对特定枚举类型写硬编码逻辑。

内容的提问来源于stack exchange,提问作者Jaanus Sepp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:22:43