Как передать несколько типов в один вызов QTest::addColumn

У меня есть функция шаблона для сериализации данных в файл, а другая — для их возврата с использованием идентификатора, возвращаемого функцией кулака:

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*, чтобы метод тестирования мог преобразовать его в правильный тип и разыменовать его. Но, к сожалению, это невозможно.

Есть ли другие варианты?


person Resurrection    schedule 14.09.2016    source источник