LINUX.ORG.RU

QIncompatibleFlag. Зачем?

 ,


0

2

В QtCore/qglobal.h есть определение QIncompatibleFlag, которое соседствует с QFlag.

Меня мучает вопрос: зачем?

Оно не документировано, и, судя по всему, документировано не будет т.к. фактически это лазейка в системе безопасности, которую обеспечивает QFlags.

Если я правильно понимаю QIncompatibleFlag позволяет использовать произвольный int в качестве флага в сумме флагов без применения cast'ов.

Это где-то используется в самой библиотеке? Если да, то почему просто не расширить перечисления необходимыми флагами?

Это используется в приложениях? Но почему тогда не задокументировать как положено?

P.S. Всё что нагуливал по этому поводу --- одно недоумение без ответа.


может это что-то типа виндового INVALID_FILE_HANDLE?

yurikoles ★★★
()

Для QFlag тоже вот в доке написано:

You should never need to use this class in your applications.

Хелпер-класс, скрыть не удалось, очевидно. Это плюсы, здесь всё так делается. Привыкай.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Хелпер-класс, скрыть не удалось, очевидно. Это плюсы, здесь всё так делается. Привыкай.

А я привычный =)

Но это не просто хелпер класс. Для того, чтобы механизм QFlags работал достаточно и просто QFlag. QIncompatibleFlag появился в Qt 4.5.

Что-то там значит произошло =)

ssvda
() автор топика
Ответ на: комментарий от schizoid

Это плюсы, здесь всё так делается.

Плохому танцору и плюсы мешают :)

const86 ★★★★★
()
Ответ на: комментарий от ssvda

Но это не просто хелпер класс. Для того, чтобы механизм QFlags работал достаточно и просто QFlag. QIncompatibleFlag появился в Qt 4.5.

Фактически этот класс используется только в qglobal.h. Пруф:

i@localhost:~/dev/ext/qt-everywhere-opensource-src-4.8.1$ grep -R 'QIncompatibleFlag' *
<Тут безумно длинное вхождение: строчка с перечислением всех классов вообще. Опустим>
src/corelib/global/qglobal.h:class Q_CORE_EXPORT QIncompatibleFlag
src/corelib/global/qglobal.h:    inline explicit QIncompatibleFlag(int i);
src/corelib/global/qglobal.h:inline QIncompatibleFlag::QIncompatibleFlag(int ai) : i(ai) {}
src/corelib/global/qglobal.h:inline QIncompatibleFlag operator|(Flags::enum_type f1, int f2) \
src/corelib/global/qglobal.h:{ return QIncompatibleFlag(int(f1) | f2); }
src/tools/uic/qclass_lib_map.h:QT_CLASS_LIB(QIncompatibleFlag, QtCore, qglobal.h)

Как-то мне не верится, что программисты Qt просто так вставили некий класс в код.

ssvda
() автор топика
Ответ на: комментарий от ssvda

Как-то мне не верится, что программисты Qt просто так вставили некий класс в код.

Ну вставили, и что? Раз интересно, место того чтоб выдерать по одной строчке из файла посмотри зачем его используют.

erfea ★★★★★
()
Ответ на: комментарий от ssvda

Используется — читай qglobal.h,

#define Q_DECLARE_INCOMPATIBLE_FLAGS(Flags) \
inline QIncompatibleFlag operator|(Flags::enum_type f1, int f2) \
{ return QIncompatibleFlag(int(f1) | f2); }
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
{ return QFlags<Flags::enum_type>(f1) | f2; } \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) \
{ return f2 | f1; } Q_DECLARE_INCOMPATIBLE_FLAGS(Flags)
Видимо, он заведует неявным преобразованием инта к флагу в конструкции QFlag() | 123, но не 123 | QFlag().

vzzo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.