如何将多个类型传递到单个QTest :: addColumn调用中

时间:2016-09-14 11:52:15

标签: c++ qt templates qtestlib qttest

我有一个模板函数,用于将数据序列化到一个文件,另一个用于使用第一个函数返回的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中混合和序列化自定义类型显然涉及一些比类型本身更多的数据。它当然不仅仅是docsQVariant所说的内容 - 我想这可能与元系统及其invoked when serializing custom typesQVariant的特殊流方法有关。 }}。

void *和dynamic_cast?

我想到的另一个选项是使用typeid的结果type_infovoid*???将替换为void中的_data *,并且会提供包含const type_info*的另一列,以便测试方法可以将其转换为正确的类型并取消引用它。 But that is unfortunately not possible it seems.

还有其他选择吗?

0 个答案:

没有答案