データをファイルにシリアル化するためのテンプレート関数と、fist 関数によって返される 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);
}
私の質問は、基本的に の代用となるべきものです???
。
それを綴る
完全を期すための明白な解決策。私は特に、すべてを入力する必要のない解決策を見つけようとしています。
Qバリアント
1 つの回避策は、を使用することQVariant
です。それに関する問題はたくさんあります。QVector<qint64>
まず、Qt タイプを使用する場合でも、メタ システムへの登録、ストリーミング オペレータの登録、および比較オペレータの登録などの必要があるため、かなり面倒です...さらに、QVariant
それ自体のシリアル化をミックスに追加し、QVariant
明らかにカスタム タイプをシリアル化しますタイプ自体よりもさらに書き込まれたデータが含まれます。確かに、ドキュメントがそうあるべきだと言っているだけではありません-メタシステムと、カスタムタイプをシリアライズするときに呼び出されるQVariant
その特別なストリーミングメソッドに関係している可能性があると思います.QVariant
void* と dynamic_cast?
私が考えた別のオプションは、typeid
の結果type_info
を一緒に使用することでしたvoid*
。は* に???
置き換えられ、テスト メソッドが適切な型に変換して参照解除できるように、を含む別の列が提供されます。しかし、残念ながらそれは不可能のようです。void
_data
const type_info*
他のオプションはありますか?