我有一个模板函数,用于将数据序列化到一个文件中,另一个使用第一个函数返回的 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_info
和void*
. 将在 the???
中替换为void
*_data
并提供包含 的另一列,const type_info*
以便测试方法可以将其转换为正确的类型并取消引用它。但不幸的是,这似乎是不可能的。
还有其他选择吗?