У меня есть функция шаблона для сериализации данных в файл, а другая — для их возврата с использованием идентификатора, возвращаемого функцией кулака:
template<typename T> int serialize(const T &value); //returns id
template<typename T> T deserialize(int id);
Теперь я хочу создать модульный тест для них с количеством типов, используя QTest
framework, соответствующий неполный 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
Один обходной путь использует QVariant
. Проблем с этим много. Во-первых, это довольно запутанно, даже при использовании типов Qt, потому что такие вещи, как QVector<qint64>
, требуют их регистрации в метасистеме, регистрации их потоковых операторов И регистрации их операторов сравнения... Кроме того, он добавляет сериализацию самого QVariant
в смесь и сериализацию пользовательских типов. в QVariant
, по-видимому, записываются некоторые дополнительные данные, кроме самих типов. Это, конечно, не просто то, что должно быть указано в документах для QVariant
. думаю, это может быть связано с метасистемой и ее специальными методами потоковой передачи, которые вызываются при сериализации пользовательских типов в QVariant
.
void* и dynamic_cast?
Еще один вариант, о котором я подумал, - использовать результат typeid
type_info
вместе с void*
. ???
будет заменено на void
* в _data
, и будет предоставлен другой столбец, содержащий const type_info*
, чтобы метод тестирования мог преобразовать его в правильный тип и разыменовать его. Но, к сожалению, это невозможно.
Есть ли другие варианты?