3

我有一个模板函数,用于将数据序列化到一个文件中,另一个使用第一个函数返回的 ID 将其检索回来:

template<typename T> int serialize(const T &value); //returns id
template<typename T> T deserialize(int id);

现在我想使用QTest框架为这些类型创建一个单元测试,相关的不完整private slots

void serialization_data()
{
    QTest::addColumn<???>("data");
    QTest::addColumn<int>("id"); //id is assigned sequentially starting from 0

    QTest::newRow("row1") << QByteArray("Array") << 0;
    QTest::newRow("row2") << QString("String") << 1;
    // etc. 
}

void serialization()
{
    QFETCH(???, data);
    QFETCH(int, id);

    QVERIFY(serialize(data) == id);
    QVERIFY(deserialize<???>(id) == data);
}

我的问题基本上是什么应该是???.

拼写出来

为了完整起见,明显的解决方案。我特别想找到一个不需要全部输入的解决方案。

QVariant

一种解决方法是使用QVariant. 问题很多。首先它相当混乱,即使在使用 Qt 类型时也是如此,因为QVector<qint64>需要将它们注册到元系统,注册它们的流操作符和注册它们的比较操作符......此外,它添加了QVariant自身的序列化到混合和序列化自定义类型QVariant中涉及一些比类型本身更进一步的数据。这当然不仅仅是文档所说的应该是什么QVariant- 我猜它可能与元系统及其在.序列化自定义类型时调用的特殊流方法有关QVariant

void* 和 dynamic_cast?

我想到的另一个选择是使用typeid's resulttype_infovoid*. 将在 the???中替换为void*_data并提供包含 的另一列,const type_info*以便测试方法可以将其转换为正确的类型并取消引用它。但不幸的是,这似乎是不可能的。

还有其他选择吗?

4

0 回答 0