如何使 std::variant<..> 可用于 QVariant?

cha*_*pok 1 c++ qt qt5

我想std::variant<Foo, Bar>用作QVariant. 这该怎么做?

#include <QCoreApplication>
#include <QMetaType>
#include <variant>

enum Foo{A, B};
enum class Bar{C, D};

Q_DECLARE_METATYPE(std::variant<Foo, Bar>);


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

error: macro "Q_DECLARE_METATYPE" passed 2 arguments, but takes just 1
 Q_DECLARE_METATYPE(std::variant<Foo, Bar>);
                                          ^
Run Code Online (Sandbox Code Playgroud)

Cal*_*eth 5

问题是Q_DECLARE_METATYPE一个宏,而宏不喜欢,s。

您可以传递类型别名

using T = std::variant<Foo, Bar>; 
Q_DECLARE_METATYPE(T)
Run Code Online (Sandbox Code Playgroud)

或额外包装使用 ()

Q_DECLARE_METATYPE((std::variant<Foo, Bar>));
Run Code Online (Sandbox Code Playgroud)