Название: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 05, 2016, 07:55 Добрый день
Это уже не раз упоминалось, но все-таки QPoint QPointF QVector2D QVector3D QVector4D Оснований обобщать выше крыши, даже невооруженным глазом видно что все они прекрасно ложатся в один template класс. Тем не менее идет дубляж (весьма ощутимый). Почему? Спасибо Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 05, 2016, 08:38 Первые три можно было бы и затемплейтить, но вот с 3д и 4д вряд ли получится.
Но мне кажется, ответ простой - каждый класс писала своя, независимая команда индусов. А потом помержили и не стали менять легаси. Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 05, 2016, 14:26 Первые три можно было бы и затемплейтить, но вот с 3д и 4д вряд ли получится. Можно затеплейтить любую размерность (что и сделано во многих других библиотеках), только векторное произведение непривычное получается. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 05, 2016, 14:55 Я имел в виду, что QPoint, QPointF и QVector2D имеют по 2 измерения, и поэтому их можно объединить в один темплейт. QVector3D уже трехмерный и поэтому для него потребуется отдельный темплейт и т.д.
Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 05, 2016, 15:20 Я имел в виду, что QPoint, QPointF и QVector2D имеют по 2 измерения, и поэтому их можно объединить в один темплейт. QVector3D уже трехмерный и поэтому для него потребуется отдельный темплейт и т.д. Ну и что? Чем мешает 3-я координата?Лично я не могу объяснить почему. Возможно неуклонное следование правилу "одна сущность - один класс". См QPointF и QVector2D. Действительно "точка" и "вектор" - разные сущности. Но в декартовых координатах они "обратимы" - любую точку можно рассматривать как вектор из начала координат, и наоборот. Что впрочем не распространяется на все системы координат. Можно затеплейтить любую размерность (что и сделано во многих других библиотеках), только векторное произведение непривычное получается. Я чаще встречал подход как в Qt - отдельный класс на каждыйНазвание: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 05, 2016, 15:29 Мб ещё потому, что тролли не любят темплейты.
Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 05, 2016, 15:44 Ну и что? Чем мешает 3-я координата? Как одним темлейтом описать и QPoint, и QVector3D ? Название: Re: Почему QPoint/QVector не template ? Отправлено: Авварон от Июль 05, 2016, 18:06 Почему? Потому, что в объектном коде всё равно получится дубляж. Зато, так не надо запрещать QPoint<void> QPoint<bool>, QPoint<QString>, а также нет гемора с QPoint<qint64> <-> QPoint<double>. А еще QVariant::toPoint - делать его шаблонным? Vector2D - это обертка над точкой, а не точка. Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 05, 2016, 21:21 Как одним темлейтом описать и QPoint, и QVector3D ? Обычно обобщают отдельно Point и Vector, так как они имеют разно поведение в применении операций суммирования, умножения деления и т.п. Код
НО! Бывает обобщают и одним типом, добавляя дополнительную размерность и значение 0 для вектора и 1 для точки (как в OpenGL). Это значение и определяет поведение точки или вектора в матричных вычислениях. Упрощенно может выглядеть так Код
Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 05, 2016, 21:25 или еще проще
template < typename _Type, int _D > class Cluster { _Type m_values[_D+1]; public: static Cluster< _Type, _D > make_point (); static Cluster< _Type, _D > make_vector (); } Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 06, 2016, 06:43 Обычно обобщают отдельно Point и Vector, так как они имеют разно поведение в применении операций суммирования, умножения деления и т.п. В декартовых координатах - совершенно одинаковое :)НО! Бывает обобщают и одним типом, добавляя дополнительную размерность и значение 0 для вектора и 1 для точки (как в OpenGL). Это значение и определяет поведение точки или вектора в матричных вычислениях. Ну вот почему никто не задаст простых естественных вопросов, напрЦитировать А как оно определяет? И зачем добавлять размерность? :)Грубое объяснение: Код Это перспективное преобразование - чем больше z тем меньше становятся x и y (точка стремится к центру экрана). Легко заметить что оно НЕ матричное (не ахвинное), первое же его применение разрушит цепочку матричных преобразований. Поэтому его и не применяют (не делят), а таскают этот делитель с собой - в той самой 4-й координате. Тогда матричные преобразования остаются корректными. А когда все вычисления/шейдеры закончились и надо рендерить - соскакивают в декартовы, делитель уже не нужен. Однако вернемся к злополучным темплейтам. С точки зрения использования. Сейчас немало повторов типа Код: void QPainter::drawLine(const QPoint & p1, const QPoint & p2); Код: template <class Point> Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 06, 2016, 07:56 Чем более вы хотите обобщить класс, тем менее специализированным он становится.
При текущем положении дел, класс получивший QPoint или QPointF знает, какую точность от него требуют и какую операцию. Получивший же обобщенный темплейт, потребует дополнительные флаги. Более того, теряется контроль ошибок аргументов. НУ и в общем и целом - преждевременная оптимизация налицо. Сначала вы проверьте все классы, сравните работу с QPoint и QPointF, проанализируйте, что будет при замене одного на другого, какие погрешности у вас выплывут, какие косячные ситуации получатся и сколько классов получат "возможности", не предусмотренные разработчиками. И таки это правильный подход - мухи отдельно, суп отдельно. Название: Re: Почему QPoint/QVector не template ? Отправлено: Old от Июль 06, 2016, 09:09 Получивший же обобщенный темплейт, потребует дополнительные флаги. Нельзя получить темплейт, вообще нельзя. Можно получить объект класса, созданного из шаблона, но тогда это уже полностью специализированный шаблон, знающий все типы. Ну и никаких дополнительных флагов не понадобиться.Более того, теряется контроль ошибок аргументов. Да вы что? :)Шаблоны и придумывали, что бы была возможность контролировать эти аргументы. Это то что не может сишный препроцессор. Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 06, 2016, 10:46 Вы придираетесь к словам, я верю что у вас достаточно ума, чтобы понять смысл фразы, а не смысл отдельных слов.
Функция, принимающая int и float, не будет знать, когда использовать int, а когда float. А так же будет запутанным поведение при смешении аргументов и как следствие неопределённое поведение для программиста. Точнее это реализуемо, но при этом гораздо более сложно, чем две функции с разными классами. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 06, 2016, 11:36 Цитировать Функция, принимающая int и float, не будет знать, когда использовать int, а когда float C++ умеет перегрузку функций... Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 06, 2016, 12:09 Перегрузка со одинаковыми параметрами? Это как?
Т.е. вы можете реализовать вот эти две РАЗНЫЕ функции? На примере повторов Код: void QPainter::drawLine(const QPoint & p1, const QPoint & p2); Код: template <class Point> Т.е. при обобщении мы сможем вызвать как drawLine(QPoint(int,int), QPoint(int,int)), так и drawLine(QPoint(float,float), QPoint(float,float)). Но различия в функциях скорее всего есть и будут. И вот как в данном случае поступить? Разве что внутри свичи ставить с типами. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 06, 2016, 12:21 QPoint и QPointF - разные типы. Не вижу проблемы.
Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 06, 2016, 12:38 Функция, принимающая int и float, не будет знать, когда использовать int, а когда float. Она легко может это узнатьКод
Но различия в функциях скорее всего есть и будут. Не исключено, но их мало по сравнению с массой дублируемого кода. А если для какой-то ф-ции это не так, то можно ее оставить как естьКод И вообще не лучше ли сказать прямо, напр Цитировать Ну там наверное тоже не дураки, посчитали что выгоднее (по существу ответ 2) Не вижу ничего зазорного в такой позиции, во всяком случае лучше чем барахтаться в чем-то наспех придуманном :) И ведь просил же не пакостить в моих темах :'(Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 06, 2016, 13:05 Просите сколь угодно.
to Racheengel: Igors говорит об обобщении этих двух типов в один шаблон. И потому никак не узнать, кроме свитчей и сравнивания типов, что пагубно влияет на читаемость и поддержку такого кода. И именно поэтому выгоднее иметь 2 типа, которые не спутать и которые ясны для программиста. Qt всё же имеет постулат - удобство важнее красоты кода. Возможно он и не звучит вслух, но явно прослеживается :) Название: Re: Почему QPoint/QVector не template ? Отправлено: Авварон от Июль 06, 2016, 13:14 Она легко может это узнать Код Не исключено, но их мало по сравнению с массой дублируемого кода. А если для какой-то ф-ции это не так, то можно ее оставить как есть При таком подходе мы получим, что ВСЕ ф-ии, принимающие Point<T, int Size> обязаны быть шаблонными => они будут инстанцироваться в пользовательском коде => размер бинаря вырастет как конь. Ничего ен напоминает? Код
А при таком подходе выигрыша почти нет. В бинарном коде копипаста будет в обоих случаях. Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 06, 2016, 13:26 Просите сколь угодно. Ага, типаЦитировать А я вот хочу говорить и БУДУ! И рот мне не закроете! И неважно что говорю полную фигню - ИМЕЮ ПРАВО! :)Qt всё же имеет постулат - удобство важнее красоты кода. Относительно недавно тут человеку понадобилось "все то же самое что QVector3D" но только "double" (а не "float"). И пришлось сносить QVector3D и прикручивать стороннюю либу. Это как, удобно?Название: Re: Почему QPoint/QVector не template ? Отправлено: Авварон от Июль 06, 2016, 13:41 И пришлось сносить QVector3D и прикручивать стороннюю либу. Это как, удобно? Это нормально, если целевая платформа не поддерживает double. Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 07, 2016, 15:29 Обычно обобщают отдельно Point и Vector, так как они имеют разно поведение в применении операций суммирования, умножения деления и т.п. В декартовых координатах - совершенно одинаковое :)НО! Бывает обобщают и одним типом, добавляя дополнительную размерность и значение 0 для вектора и 1 для точки (как в OpenGL). Это значение и определяет поведение точки или вектора в матричных вычислениях. Ну вот почему никто не задаст простых естественных вопросов, напрЦитировать А как оно определяет? И зачем добавлять размерность? :)Грубое объяснение: Код Это перспективное преобразование - чем больше z тем меньше становятся x и y (точка стремится к центру экрана). Легко заметить что оно НЕ матричное (не ахвинное), первое же его применение разрушит цепочку матричных преобразований. Поэтому его и не применяют (не делят), а таскают этот делитель с собой - в той самой 4-й координате. Тогда матричные преобразования остаются корректными. А когда все вычисления/шейдеры закончились и надо рендерить - соскакивают в декартовы, делитель уже не нужен. Это не совсем так. Четвертую координату добавляют как раз для того, чтобы в декартовых координатах ввести разницу между понятиями Point и Vector при их обобщении в алгебраических операциях. Но это чисто математический трюк). Например, результат операции point + point является невалидным (даже логически неясно, что имеется в виду), так как четвертая координата будет равна 2, а вот результат операции нахождения средины отрезка 0.5 * ( point + point ) уже валиден. В то же время операции с вектором обе валидны. Вектор является инвариантной величиной, а точка - нет. Это означает что изменение положения точки начала отсчета на компоненты вектора никак не повлияет, а на координаты точки - повлияет. Операции масштабирования осуществляется с помощью первых трех компонент матрицы на диагонали (четвертый всегда равен 1), а операция перемещения осуществляется с помощью трех компонент 4-го столбца матрицы. Таким образом операция перемещения на точки действует, а на векторы - нет. В отображении участвуют всегда только точки, при этом четвертая компонента может быть использована для проверки валидности произведенных расчетов, так как должна быть равна 1 (с учетом вычислительных погрешностей). Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 07, 2016, 15:46 По теме шаблонов для точки и вектора.
Так получилось, что много работаю с геометрией и графикой, которые имеют различную точность представления. Графические точки - float, геометрические - double или с повышенной точностью (http://neerc.ifmo.ru/wiki/index.php?title=Adaptive_precision_arithmetic). Без шаблонного их представления здесь просто не обойтись. Реализация QPoint и QPointF весьма убога в геометрическом смысле, эти типы удобны для использования только в GUI. Отсутствие шаблонной реализации в Qt, скорее всего, связано с политикой простоты вхождения для новичков, хотя по сути это копипаст. Инструмент Qt позиционируется, как легкий в использовании, и не требующий глубоких познаний языка программирования, поэтому они всячески избегают шаблонов в API. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 07, 2016, 16:54 ну, point + point = point, не вижу проблем)
Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 08:46 Это не совсем так. Четвертую координату добавляют как раз для того, чтобы в декартовых координатах ввести разницу между понятиями Point и Vector при их обобщении в алгебраических операциях. Но это чисто математический трюк). Ну это уже не декартовы координаты, а "однородные". Факт отличия вектор/точка конечно любопытен, но и только - какая от него польза? Мне известно только одно реальное применение - положить перспективу под матрицу. И то, правду сказать, какой-то абсолютной необходимости в этом не вижу. Перспективное преобразование или последнее в цепочке ("в экран") или первое при обратном. Ну поделил/помножил - потом уже матрицы.ну, point + point = point, не вижу проблем) Если строго следовать "сущностям" то такое сложение бессмысленно. Складываются вектора - для них эта операция определена. Очевидно чтоЦитировать point - point = vector Ведь "разница между позициями" сама по себе не позиция. А что такое "сумма точек" - хз. Поэтому проще в эти подробности не углубляться, просто в декартовых координатах с чистой совестью можно рассматривать точку как вектор - и наоборотНазвание: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 09:06 Без шаблонного их представления здесь просто не обойтись. Так а что GUI - не люди что ли? :)Реализация QPoint и QPointF весьма убога в геометрическом смысле, эти типы удобны для использования только в GUI. Отсутствие шаблонной реализации в Qt, скорее всего, связано с политикой простоты вхождения для новичков, хотя по сути это копипаст. Инструмент Qt позиционируется, как легкий в использовании, и не требующий глубоких познаний языка программирования, поэтому они всячески избегают шаблонов в API. Ладно, попробовал прошагать тот же самый пример drawLine Код Если исходные точки были QPointF, то все точно так же, сдублированные методы void QPainter::drawLines и QRasterPaintEngine::drawLines выглядят одинаково. Все равно все сводится к QCosmeticStroker::drawLine который уже не имеет вариантов а принимает QPointF. Тут пришла простая мысля - ну а какой должна быть организация файлов/проекта если хотим template? Выходит QPainter::drawLines нужно тащить в хедер? И QRasterPaintEngine::drawLines тоже? И еще много-много всего? Как-то выходит "все кишки наружу", причем со всеми private подробностями Название: Re: Почему QPoint/QVector не template ? Отправлено: Авварон от Июль 08, 2016, 09:14 Без шаблонного их представления здесь просто не обойтись. Так а что GUI - не люди что ли? :)Реализация QPoint и QPointF весьма убога в геометрическом смысле, эти типы удобны для использования только в GUI. Отсутствие шаблонной реализации в Qt, скорее всего, связано с политикой простоты вхождения для новичков, хотя по сути это копипаст. Инструмент Qt позиционируется, как легкий в использовании, и не требующий глубоких познаний языка программирования, поэтому они всячески избегают шаблонов в API. Ладно, попробовал прошагать тот же самый пример drawLine Код Если исходные точки были QPointF, то все точно так же, сдублированные методы void QPainter::drawLines и QRasterPaintEngine::drawLines выглядят одинаково. Все равно все сводится к QCosmeticStroker::drawLine который уже не имеет вариантов а принимает QPointF. Тут пришла простая мысля - ну а какой должна быть организация файлов/проекта если хотим template? Выходит QPainter::drawLines нужно тащить в хедер? И QRasterPaintEngine::drawLines тоже? И еще много-много всего? Как-то выходит "все кишки наружу", причем со всеми private подробностями Да, придётся тащить, я об этом уже писал, что получится новый буст. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 08, 2016, 09:51 скорость компиляции тоже роль играет, темплейты медленные.
Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 08, 2016, 11:16 скорость компиляции тоже роль играет, темплейты медленные. Скорость выполнения на темплейтах часто быстрее), так как компиляторы тщательнее оптимизируют код и многое вычисляется на этапе компиляции, даже если это специально и не просили каким-нибудь constexpr. Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 08, 2016, 13:41 Цитировать Скорость выполнения на темплейтах часто быстрее Скорость ВЫПОЛНЕНИЯ быстрее не будет, т.к. темплейты по сути - это макросы, которые разворачиваются в полноценный С-код перед тем, как он будет скомпилирован. Я же говорю о скорости КОМПИЛЯЦИИ. Чем больше в проекте темплейтов - тем медленнее он собирается. Вполне возможно, что это была одна из причин, побудивших троллей отказаться от темплейтов. Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 15:19 Ну хорошо, в любом случае менять все вызовы на темплейты уже поздно. Но тогда почему не так
Код А внутри уже вызвать template вариант, напр Код Так можно схлопнуть немало кода, можно создавать свои инстансы (пример с QVectir3D double), ну а кто побойчее - cможет и xxx_template вызовы прикрутить. Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 08, 2016, 16:59 Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором.
Всё что вы предлагаете усложняет код, но не даёт никаких преимуществ. Вот вообще никаких на мой взгляд. Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 17:34 Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором. Ладно, вот написали Вы чего-то "на шару", типа "авось угадаю, а если нет - мне объяснят, и так я получу новые знания" (сомнительный способ). Ну поясните почему Вы никогда не попадаете в такт/масть? Если уж гадаете - то должны же хоть когда-то угадывать - но этого не происходит. Ну почему Ваши ответы просто неразумны (о какой-то полезности я уже молчу)?Всё что вы предлагаете усложняет код, но не даёт никаких преимуществ. Вот вообще никаких на мой взгляд. Название: Re: Почему QPoint/QVector не template ? Отправлено: ssoft от Июль 08, 2016, 17:39 Скорость ВЫПОЛНЕНИЯ быстрее не будет, т.к. темплейты по сути - это макросы, которые разворачиваются в полноценный С-код перед тем, как он будет скомпилирован. ... Шаблонные методы используются компилятором в виде реализаций прямо в заголовочных файлах, в то время как нешаблонные обычно скрыты внутри исходников. Таким образом множество шаблонных методов воспринимаются компилятором как inline или constexpr, что позволяет обеспечить более эффективную оптимизацию (конечно за счет увеличения размера бинарника). Шаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора. Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное". Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 08, 2016, 17:43 А вы опровергните мои слова. Тогда у нас выйден спор. А в конце спора, если вы не убежите от темы(как обычно), мы получим вывод - правдиво ли это и имеет ли право на существование.
Название: Re: Почему QPoint/QVector не template ? Отправлено: Racheengel от Июль 08, 2016, 18:44 Шаблонные методы используются компилятором в виде реализаций прямо в заголовочных файлах, в то время как нешаблонные обычно скрыты внутри исходников. Конечно. И именно поэтому компилятор каждый раз заново перекомпилирует шаблонный код, который находится в инклуде. В то время как cpp-файл требуется пересобрать только 1 раз. Чем больше шаблонов, тем медленнее компиляция. Для больших проектов это часто фатально. Шаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора. ??? Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное". Какие специалисты? Где они? Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 18:46 А вы опровергните мои слова. Тогда у нас выйден спор. :) Не думаю. Вы такое пишете что опровергать уже как-то неудобно :)Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором. Каждая "инстанса" темплейта - разная, и типизированный контроль для нее никак не менее строг. Это пишется один раз, а "инстанциироваться" может сколько угодно - и каждый раз все будет откомпилено как будто было скопи-пастено. Вы раз 100 это слышали хотя бы на этом форуме - ну зачем нести такую пургу? :)Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 08, 2016, 18:58 Шаблонные методы используются коШаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора. Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное". Верю (кстати не знал об этом).Но все-таки четкого ответа "почему так в Qt" как-то не звучит. Вроде бы случай хрестоматийный, можно даже сказать "ну если это не темплейтить, то что же тогда темлейтить?" Кстати вот интересно: допустим в либе есть какая-то темплейтщина, напр Код Но в той же либе уже есть какие-то инстанциации. Что будет когда либа подключается - бросится ли он опять "инстанциировать" - или сможет просто слинковать имеющиеся? Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 08, 2016, 19:40 Фраза: В Qt почти не используются темплейты.
Что думает Igors: Разработчики не умеют работать с темплейтами, поэтому они создали библиотеку без них. Однако полностью отказаться не смогли, поэтому им стыдно и это выражает глубокую депрессию тимлида. Что имели в виду разработчики: Напишем без темплейтов млеать :D Название: Re: Почему QPoint/QVector не template ? Отправлено: Igors от Июль 09, 2016, 12:24 Что думает Igors: Разработчики не умеют работать с темплейтами, Я думаю тамошние разработчики умеют работать с темплейтами дай бог всякому. Но почему-то здесь они (явно сознательно) уклонились от них. Причины этого решения мне хотелось бы уяснить.Ладно, зайдем с др стороны. Да, дублируется код QPoint и QPointF чтобы иметь четкую организацию проекта/либы (а не вакханалию с хедерами). Меня это объяснение устраивает. Но остается еще немало QVector2D QVector3D QVector4D Ну они-то почему не template? На них ведь нет завязок QPainter и др Название: Re: Почему QPoint/QVector не template ? Отправлено: Bepec от Июль 09, 2016, 12:36 Да уже десятки раз отвечали, если подумать. Структура Qt должна быть проста и понятна. У неё самый низкий порог вхождения среди всех языков программирования, что даёт нехилое такое преимущество.
Вот вы хотите шаблонов, но какая выгода от шаблонов будет? Причина "дублирование кода" не принимается - это скорее вопрос стиля, а не эффективности UI библиотеки Qt. Уберём простоту Qt, добавим пару десятков шаблонов, наплодим фабрики и функторы где надо и где не надо и получим второй буст, страшный и непонятный для новичков. В котором используется дай боже 10% всех возможностей, а оставшиеся 90% не знает никто, кроме разработчиков. PS наглядный пример - если что то не работает в Qt, всегда можно посмотреть в исходном коде, что и как там происходит. Чтобы сделать то же самое в бусте, нужен как минимум полугодовой опыт в расшифровке шаблонов. Название: Re: Почему QPoint/QVector не template ? Отправлено: Авварон от Июль 10, 2016, 11:07 QVector2D QVector3D QVector4D Ну они-то почему не template? На них ведь нет завязок QPainter и др Ну потому что это получится что-то типа тупля (ха-ха, смешное слово - тупель) со всеми вытекающими. Код: QVector3d v; Код: QVectorXd<3> v; (или какой там синтаксис сеттеров у тупля) Это касательно размерности. Касательно дабл-флоат - кажется, я уже отвечал, когда они писались, не все платформы поддерживали дабл (это сейчас qreal в дабл всегда дефайнится). Думаю, в Qt6 они станут дабловыми (если будет такая нужда) Из мейл-листа: Цитировать For most of graphics floats is the "right" choice as it maps directly to OpenGL, is storage-wise efficient and quality-wise precise enough. Then for the cases where precision is very important, we should explicitly use double. |