У меня есть функция шаблона для сериализации данных в файл, а другая — для извлечения их обратно с использованием идентификатора, возвращенного функцией fist:
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
результат type_info
вместе с void*
, ???
будет заменен void
* в _data
и другой столбец, содержащий const type_info*
будет предоставлен для того, чтобы метод теста мог преобразовать его в правильный тип и разыменовать его. Но, к сожалению, это невозможно.
Есть ли другие варианты?
Задача ещё не решена.
Других решений пока нет …