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

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

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

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]