我有一个模板函数,用于将数据序列化到一个文件,另一个用于使用第一个函数返回的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
中混合和序列化自定义类型显然涉及一些比类型本身更多的数据。它当然不仅仅是docs对QVariant
所说的内容 - 我想这可能与元系统及其invoked when serializing custom types中QVariant
的特殊流方法有关。 }}。
void *和dynamic_cast?
我想到的另一个选项是使用typeid
的结果type_info
和void*
。 ???
将替换为void
中的_data
*,并且会提供包含const type_info*
的另一列,以便测试方法可以将其转换为正确的类型并取消引用它。 But that is unfortunately not possible it seems.
还有其他选择吗?