Получить идентификатор объявленного QMetaType во время компиляции? - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь зарегистрировать 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>();

, и она не работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...