c++ - Q_ENUM 到 ostream

标签 c++ qt enums qmetaobject

在一个项目中有一个自定义记录器,我想将其扩展为像 qDebug() 那样写入枚举值。有一些简单的方法吗?

这是我认为可能有效的方法(但事实并非如此):

template <typename T>
typename QtPrivate::QEnableIf<QtPrivate::IsQEnumHelper<T>::Value, std::ostream>::Type
operator<<(std::ostream& os, T enumValue)
{
    const QMetaObject* mo = qt_getEnumMetaObject(enumValue);
    int enumIdx = mo->indexOfEnumerator(qt_getEnumName(enumValue));
    return os << mo->enumerator(enumIdx).valueToKey(enumValue);
}

class MyObjet : public QObject
{
    Q_OBJECT
public:
    enum class Action { Open, Save, New, Copy, Cut, Paste, Undo, Redo, Delete };
    Q_ENUM(Action)
    explicit MyObjet(QObject* parent);
    void myFunction(Action a)
    {
        std::count << "Action is:" << a << std::endl;
    }
};

最佳答案

这是插入运算符重载,我将其放在名为 qtenum2ostream.h 的头文件中:

#ifndef QTENUM2OSTREAM_H
#define QTENUM2OSTREAM_H

#include <QMetaEnum>

template<typename T>
typename std::enable_if<QtPrivate::IsQEnumHelper<T>::Value, std::ostream  &>::type
operator<<(std::ostream & o, const T & t)
{
    const QMetaObject* metaobject = qt_getEnumMetaObject(t);
    int enumindex = metaobject->indexOfEnumerator(qt_getEnumName(t));
    o << metaobject->enumerator(enumindex).valueToKey(static_cast<int>(t));
    return o;
}

#endif // QTENUM2OSTREAM_H

您现在可以在示例类中使用它:

#include "qtenum2ostream.h"
#include <iostream>

#include <QObject>

class MyObject : public QObject {
    Q_OBJECT
public:
    enum class Action { Open, Save, New, Copy, Cut, Paste, Undo, Redo, Delete };
    Q_ENUM(Action)
    void myFunction(Action a)
    {
        std::cout << "Action is:" << a << std::endl;
    }
};

关于c++ - Q_ENUM 到 ostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926672/

相关文章:

c++ - 在 C++ 中使用虚方法的段错误

C++ Qt 和 WinExec - 将 CMD 输出保存到特定文件夹中的文件

java - 找出构造了哪个枚举值

java - 到达java中枚举元素内部的变量

c++ - 使用 QDomDocument 时报告详细的 XML 错误

asp.net-mvc - MVC3 枚举选择列表,使用显示注释

c++ - 有什么方法可以表达函数参数?

c++ - arm-none-eabi-g++ 调用全局构造函数

c++ - 在至少访问 X 节点一次的图中查找最短路

c++ - Qt Assistant 在 Linux 中因启用远程控制选项而失败