1. union联合体
union
是c++中的一个类型,与struct
看起来很像,但是用法却完全不同。
union
中的各个成员变量共享一块内存区域,对任何一个成员变量的修改都会影响其他成员变量的值。
下面是一个演示案例:
union Data
{
int i;
double d;
};
int main( int /*argc*/, char** /*argv*/)
{
Data d;
d.i = 10;
printf("%d\n", d.i );
printf("%g\n", d.d );
d.d = 10;
printf("%d\n", d.i );
printf("%g\n", d.d );
}
输出的结果为:
10
6.95251e-310
0
10
2. Qt 中的 QVariant变量
QVariant
包含了一个union
和type
字段,union
字段可以存储不同类型的数据,type
可以记录实际数据的类型。
储存自定义类需要通过Q_DECLARE_METATYPE来声明。
使用案例:
//自定义类型
class Agent {
public:
int id;
QPoint pos;
};
struct CarPos {
int x;
int y;
};
//注册为元类型
Q_DECLARE_METATYPE(Agent)
Q_DECLARE_METATYPE(CarPos)
int main( int /*argc*/, char** /*argv*/)
{
QVariant variant(42);
qDebug() << variant.typeName(); // int
qDebug() << variant.toInt(); // 42
variant.setValue(QString("yes"));
qDebug() << variant; // QVariant(QString, "yes")
variant.setValue(4.17);
qDebug() << variant; // QVariant(double, 4.17)
variant.setValue(QPoint(2,2));
qDebug() << variant; // QVariant(QPoint, QPoint(2,2))
variant.setValue(Agent {0, QPoint(1,1)});
qDebug() << variant.typeName(); // Agent
qDebug() << "id:" << variant.value<Agent>().id << ",pos:" << variant.value<Agent>().pos; // id: 0 ,pos: QPoint(1,1)
variant.setValue(CarPos{2,2});
qDebug() << variant.typeName(); // CarPos
qDebug() << "x:" <<variant.value<CarPos>().x << ",y:" << variant.value<CarPos>().y; // x: 2 ,y: 2
}