3

データをファイルにシリアル化するためのテンプレート関数と、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_dataconst type_info*

他のオプションはありますか?

4

0 に答える 0