宏映射 ENUM

Qt 如何调用其他 C++ 头文件里的 ENUM?

#include <iostream>
#include <map>
#include <string>

#define BEGIN_ENUM_VALUEMAP(Enum) static const std::map<Enum,std::string> Enum ## Map= {
#define ENUM_VALUEMAP_VALUE(Enum) { Enum, #Enum }
#define END_ENUM_VALUEMAP };

enum Test
{
    AA,
    B
};

BEGIN_ENUM_VALUEMAP(Test)
ENUM_VALUEMAP_VALUE(AA),
ENUM_VALUEMAP_VALUE(B)
END_ENUM_VALUEMAP

int main()
{
    std::cout << TestMap.at(AA) << std::endl;
    return 0;
}

LT:Q_ENUM 和 QMetaEnum 用来操作其他C++里面的 enum ,可行否? 引入的头文件

诸葛不亮:做不到,别人的头文件你不能改。你改了后它的数据结构就变了,和原有的库文件就匹配不上了

LT:ok ,昨天尝试总是报错,目的是想 直接用 valuetokey 功能

诸葛不亮:Qt元对象系统是侵入性的,必然会修改原有的数据结构。你要改第三方的,就得用非侵入性的方式,比如建个enum和string映射的map

诸葛不亮:市面上很多反序列化框架都是这么写的,用宏声明额外的数据结构,非侵入式改造。还可以做一套宏,把前面声明enum Test那段也合并进去,就剩后面四句宏,同时完成数据结构声明和反射结构生成

改成 Qt 的数据类型

#include <QString>
#include <QDebug>
#include <QMap>

#define BEGIN_ENUM_VALUEMAP(Enum) static const QMap<Enum,QString> Enum ## Map= {
#define ENUM_VALUEMAP_VALUE(Enum) { Enum, #Enum }
#define END_ENUM_VALUEMAP };

enum Test
{
    AA,
    B
};

BEGIN_ENUM_VALUEMAP(Test)
ENUM_VALUEMAP_VALUE(AA),
ENUM_VALUEMAP_VALUE(B)
END_ENUM_VALUEMAP

int main()
{
    qDebug() << TestMap.value(B);
    return 0;
}

 

参考

https://www.cnblogs.com/zi-xing/p/4550246.html

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.