Насколько современный язык С++ используется в Qt?

Я слышал, что Qt API написан на довольно устаревшем языке С++. Это правда? Существуют ли какие-либо планы по использованию более современного языка С++? Есть ли официальная информация об этом?

Существуют ли какие-либо проекты с целью обернуть текущие конструкторы Qt API с более современным С++?

UPDATE
Это больше для этого вопроса, чем шаблонов, и это не вопрос только о текущем состоянии дел (почему я пометил его будущим тегом).

UPDATE
Я особенно обеспокоен Qt API, поскольку это то, с чем работают пользователи этой структуры.
Использование современного языка С++ в API делает его более надежным, гибким и простым в использовании.
Какой тип С++ используется внутри Qt гораздо менее важен для меня.

Ответ 1

Qt, как известно, не использует шаблоны, одну очень полезную современную функцию С++. Но это не означает, что в Qt API требуется оболочка. Qt использует внутренние прекомпиляторы для решения тех же проблем. Некоторым не нравится этот подход, но Qt API очень прост и эффективен, и я не верю, что существует настоятельная необходимость его модернизации. В частности, сигналы и слоты, очень впечатляющие функции из Qt, могут быть достигнуты с использованием шаблонов (см. boost.signals), но способ Qt реализован, он все еще намного эффективнее.

Я бы сказал "не волнуйтесь и используйте Qt как есть".

EDIT: Извините, я забыл о контейнерах шаблонов, снабженных Qt. Но, тем не менее, Qt API очень мало использует классы шаблонов. Это не означает, что они не используют их внутри Qt, хотя или что их способ кодирования устарел.

Boost.Signals, вероятно, более мощные, чем Qt-сигналы/слоты, но, насколько я могу судить, нет споров о том, что проще в использовании. Одна очень убедительная реализация принципа KISS.

Ответ 2

Qt использует современные варианты языка С++ - в настоящее время С++ 98, и да Шаблоны также используются там, где они подходят. Qt имеет некоторую поддержку для STL. См. http://qt-project.org/doc/qt-5.1/qtcore/containers.html - и удобные функции, например. std::string. Все это в документах: http://qt-project.org/doc/qt-5.1/qtdoc/index.html;) Вопрос о шаблонах vs moc - это тот, который мы получаем так часто, что добавили его в нашу документацию; http://qt-project.org/doc/qt-4.8/templates.html

Ответ 3

Источники

Qt содержат шаблон "template <" 1280 раз только в src/corelib. Я не вижу, как это может быть ошибочно, поскольку "Qt известно, что он не использует шаблоны"

Ответ 4

В отличие от Boost.Signals, реализация Qt сигналов/слотов является потокобезопасной с использованием связанных в очереди соединений. Однако 2 мая 2009 года Boost.Signals2 был выпущен и принес с собой очень желательную безопасность потоков. С точки зрения разработчика, реализация Qt сигналов/слотов намного проще в использовании, главным образом из-за того, что в ней не используются шаблоны. Для углубленного изучения того, почему Qt использует moc вместо шаблонов для сигналов и слотов, здесь страница из их документации.

Для тех, кто задается вопросом, почему у Qt есть собственный набор классов контейнеров, я почти уверен, что основная мотивация заключалась в том, чтобы предложить неявный обмен. Все классы контейнера неявно разделяются, поэтому всякий раз, когда копируется QList, копируется только указатель на данные. См. здесь для получения дополнительной информации о мелком копировании в Qt.

Ответ 5

Чтобы ответить на ваш вопрос, Qt API является всеобъемлющим. Я уверен, что они выйдут с функцией QApp:: ParkMyCar() некоторое время. Иногда они реализуют несколько способов сделать то же самое, с разными позициями по эффективности и простотой использования. Проверьте их (отличную) документацию. Он такой же всеобъемлющий, и спас меня задницу не один раз.

Из того, что я видел в исходном коде Qt, код очень эффективен.
Взгляните на функции в конфигурации установки - вы можете включить/выключить поддержку различных функций (включая STL, потоки и даже графический интерфейс). Кроме того, когда тролли сделали Qt 4 на земле, они не обменялись чертами с кодовым джазом - они просто доставляли больше того и другого. Учитывая качество их программистов и их способ обновления основных версий, я не думаю, что нам нужно беспокоиться о том, что Qt (или части) устаревают.

Целевой рынок Qt (для настольных компьютеров) - это компания MamaPapa, которая делает часы Hello Kitty настольными, и хочет, чтобы код один раз и был уверен, что он работает на всех "нормальных" системах - Windows 98 и выше, популярные дистрибутивы Linux и Mac OS X. Это означает потворство ЖК-дисплею всех основных компиляторов в каждом виде системы. Если это означает, что шаблон-волшебство в их коде будет минимальным, пусть будет так.

Ответ 6

Мне действительно не нравится, как Qt удалось реализовать свой механизм сигналов/слотов. Их прекомпилятор "moc" действительно пахнет как хак для меня, и он даже не поддерживает стандартный С++.

Я думаю, было бы здорово, если бы Qt мог модернизировать себя, чтобы использовать по крайней мере классы STL. То, что было бы действительно удивительным, было бы для Qt использовать Boost по возможности (особенно Boost.Signals).

Ответ 7

На протяжении всего срока службы Qt 4.x я сомневаюсь, что имеет смысл переписать части Qt для использования, например. "более современный" С++. Это связано с предпосылкой, что все выпуски в одной и той же основной версии Qt должны быть совместимы с двоичными файлами. Мы также не можем просто устаревать или обесценивать классы, которые все еще используют клиенты (хотя совершенно нормально вводить новые материалы даже для ограниченного набора поддерживаемых компиляторов).

Если, наконец, Qt 5 находится почти вне дома, а современные С++-конструкции и функции наконец доступны на целевых поддерживаемых платформах и компиляторах, и это поможет разработчикам и клиентам С++ писать лучший и более мощный код, затем почему бы и нет?

Ответ 8

Мне тоже не нравится, как Qt добавляет магию вуду в С++. Он использует так много макросов, что это ужасно напоминает мне о C. На данный момент нет ничего, что указывало бы, что Qt будет более добрым к функциям С++ в будущем. Я бы очень хотел, чтобы это было больше похоже на С++, а не на собственный язык (например, зачем нам нужны std::vector < > и QVector < > или Qt сигналы, Boost.Signals и sigС++?)

Ответ 9

Qt является библиотекой и нуждается в поддержке широкого спектра компиляторов. Он по-прежнему поддерживает MSVC6, например. (Я думаю, что Qt Software постепенно отказывается от поддержки для этого). Это ограничивает более современные возможности С++, которые Qt может использовать.

Но это не означает, что вы не можете использовать их в своей программе Qt.