Я пытаюсь зарегистрировать std::string
для использования с QVariant и заставить его конвертировать в другой тип, который также функционирует как вариант, но необходим для сериализации.Я попытался сделать это с помощью следующего кода:
Q_DECLARE_METATYPE (std::string)
const int std_string_enum = qMetaTypeId<std::string>();
void to_example_type(example_type &j, const QVariant &q_variant) {
qRegisterMetaType<std::string>("std::string");
switch (q_variant.userType()) {
case QMetaType::Bool:
j = q_variant.value<bool>();
break;
case QMetaType::Int:
j = q_variant.value<int>();
break;
case QMetaType::UInt:
j = q_variant.value<unsigned int>();
break;
case QMetaType::Double:
j = q_variant.value<double>();
break;
case QMetaType::Long:
j = q_variant.value<long>();
break;
case QMetaType::LongLong:
j = q_variant.value<long long>();
break;
case QMetaType::Short:
j = q_variant.value<short>();
break;
case QMetaType::Char:
j = q_variant.value<char>();
break;
case QMetaType::ULong:
j = q_variant.value<unsigned long>();
break;
case QMetaType::ULongLong:
j = q_variant.value<unsigned long long>();
break;
case QMetaType::UShort:
j = q_variant.value<unsigned short>();
break;
case QMetaType::UChar:
j = q_variant.value<unsigned char>();
break;
case QMetaType::Float:
j = q_variant.value<unsigned char>();
break;
case QMetaType::QString:
j = (q_variant.value<QString>()).toStdString();
case std_string_enum:
j = q_variant.value<std::string>();
break;
default:
assert((false, "Can't Convert to example_type"));
break;
}
}
, но столкнулся со следующей ошибкой:
error: the value of 'std_string_enum' is not usable in a constant expression
case std_string_enum:
note: 'std_string_enum' was not initialized with a constant expression
const int std_string_enum = qMetaTypeId<std::string>();
note: 'static constexpr int QMetaTypeId2<T>::qt_metatype_id() [with T = std::__cxx11::basic_string<char>]' is not usable as a constexpr function because:
static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
Если я объявлю это вместо константного выражения:
constexpr int std_string_enum = qMetaTypeId<std::string>();
Я получаю следующую ошибку:
in constexpr expansion of 'qMetaTypeId<std::__cxx11::basic_string<char> >()'
error: 'static constexpr int QMetaTypeId2<T>::qt_metatype_id() [with T = std::__cxx11::basic_string<char>]' called in a constant expression
return QMetaTypeId2<T>::qt_metatype_id();
note: 'static constexpr int QMetaTypeId2<T>::qt_metatype_id() [with T = std::__cxx11::basic_string<char>]' is not usable as a constexpr function because:
static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
error: call to non-constexpr function 'static int QMetaTypeId<std::__cxx11::basic_string<char> >::qt_metatype_id()'
static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
Я смущен этой ошибкой, так как документация гласит (выделение мое):
Возвращает идентификатор метатипа типа T во время компиляции. Если тип не был объявлен с помощью Q_DECLARE_METATYPE (), компиляция завершится неудачей.
После поиска в Google, я нашел эта переписка , которая была доступна только через сторонний архивный сайт, так как Google не кэшировал результаты:
Сообщение от a***@fastmail.fm Thiago -В документации qMetaTypeId (http://qt -project.org / doc / qt-5.1 / qtcore / qmetatype.html # qMetaTypeId ) специально указано, что регистрация типов с использованием этой функции разрешается во время компиляции, а не запускается-время.
Документация неверна.То, что Стивен сказал, верно.
однако это было сделано 5 лет назад, и я скептически отношусь к тому, что документация не была бы исправлена или доказана в то время!
Это кажется довольно распространенной проблемой для использования qvariants с другими системами, что если я могу что-то сделать, чтобы правильно использовать QVariant в этом сценарии?Есть ли способ получить идентификатор во время компиляции?
Заметьте, я использую C ++ 14 с Qt 5.8, если мне нужно обновить qt, насколько я могу.
РЕДАКТИРОВАТЬ:
Я обновил свою версию mingw-64 и версию QT, она все еще выдает ту же ошибку.Кроме того, я попытался просто зарегистрировать пустую структуру, например:
struct Test{
};
Q_DECLARE_METATYPE (Test)
const int test_enum= qMetaTypeId<Test>();
, и она не работает