Russian Qt Forum
Ноябрь 23, 2024, 06:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: "Не-темплейтность" Qt  (Прочитано 26332 раз)
RSATom
Гость
« Ответ #15 : Март 16, 2015, 10:46 »

Два шаблона - потому что неправильно сравнивать double через ==, поскольку статистически два double с большой долей вероятности будут не равны, но отличатся могут на бесконечно малое значение, которое может считаться приемлемым. А значит математика для int и для double будет разная, а значит будет шаблон, и его специализация для чисел с плавающей точкой, т.е. как минимум 2 шаблона.

Если тезис про то что использовать == с double нежелательно звучит для вас бредом - могу пояснить на примере.
Записан
RSATom
Гость
« Ответ #16 : Март 16, 2015, 11:03 »

А зачем джуниору что-то ломать?

Если есть 2 способа сделать нечто, лично я предпочту тот что будет проще в понимании. Видимо ребята в Qt думают так же. Хотя нет, это не правда, ребята не использует шаблоны в Qt просто потому что как минимум некоторое время назад (а возможно и сейчас) вынуждены были работать на платформах с не самыми современными компиляторами. И кстати это же один из доводов против использования исключений.

Да, и тот же Qt вовсе не стесняется "трудностей с пониманием",  см напр во что выливается Q_DECLARE_METATYPE

Да, просто существуют вещи которые невозможно/сложно/не разумно сделать проще (по разным причинам).
« Последнее редактирование: Март 16, 2015, 11:15 от RSATom » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #17 : Март 16, 2015, 11:07 »

Какой оператор правильно использовать для операций над целочисленными типами, и не совсем правильно выполнять для чисел с плавающей точкой?
Что значит "не совсем" правильно? Для какой аппаратной платформы? Для какого компилятора?

Каюсь, как это зачастую бывает на собеседованиях, вопрос был недостаточно точен:
Какой встроенный оператор...
Что такое "встроенный" оператор? Во что встроенный?

Такого рода вопросы - отличная тема для беседы с потенциальным новичком, но отнюдь не повод ожидать от него "правильных" ответов.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #18 : Март 16, 2015, 11:11 »

Да тот же самый что сейчас (если это сейчас работает). Вариант-минимум
Код
C++ (Qt)
typedef TPoint <int> QPoint;
typedef TPoint <qreal> QPointF;
И пусть все остальное как сейчас. Найдется немало ф-ций где удобнее template аргумент вместо дублирования и/или копирования туда-сюда

Сейчас такой проблемы нет.
Далее, как уже верно упомянули, operator== работает по-разному для целочисленных и вещественных точек (точное равенство или с точностью эпсилон). В вашем случае это выльется в еще большее количество кода

Если возникает такое страстное желание сделать bool точку (что это?), а тем более void  Непонимающий, то вот пусть автор и "специализирует", какой смысл он в это вкладывал - хз

Ну это разведение шаблонов позволяет делать бул точки. Нет шаблонов - нет проблемы.

Вообще, вы подходите к вопросу с точки зрения типичного с++ кодера - надо всё зашаблонить не думая о последствиях. В данном примере шаблоны не нужны. А, например, QAtomicInt имеет шаблонную базу QAtomicInteger<T>. Кстати, начиная с 5.3 он публичный.
Записан
RSATom
Гость
« Ответ #19 : Март 16, 2015, 11:13 »

Что значит "не совсем" правильно? Для какой аппаратной платформы? Для какого компилятора?
Платформа и компилятор значения не имеет.

Для примера, скажите, равны ли два числа 1.999999998 и 1.999999991 ?

Что такое "встроенный" оператор? Во что встроенный?

встроенный в моем понимании это не перегруженный.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #20 : Март 16, 2015, 11:14 »


Какой встроенный оператор...



define "встроенный". Мембер что ли? У QPointF нет мембер operator ==
Если built-in то такого тоже не существует для точек.
Записан
RSATom
Гость
« Ответ #21 : Март 16, 2015, 11:19 »

речь шла о сравнении примитивных типов через ==

P.S. похоже я все же плохо умею выражать свои мысли...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #22 : Март 16, 2015, 11:29 »

речь шла о сравнении примитивных типов через ==

P.S. похоже я все же плохо умею выражать свои мысли...


А, тьфу, это я читать не умею:) Был сконфужен что это в теме про точки) Про флоат\дабл вопрос абсолютно стандартный.
Записан
RSATom
Гость
« Ответ #23 : Март 16, 2015, 11:41 »

А, тьфу, это я читать не умею:) Был сконфужен что это в теме про точки) Про флоат\дабл вопрос абсолютно стандартный.

Уфф, отлегло... Подмигивающий
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #24 : Март 16, 2015, 11:48 »

Платформа и компилятор значения не имеет.
К сожалению, Вы нам не подходите. Мы ищем специалиста по разработке приложений для микроконтроллеров/ПЛИС/GPU, где вообще нет целочисленных регистров и машинных команд для манипуляции целочисленными данными, а вся целочисленная арифметика реализована как частный случай операций над числами с плавающей точкой.

Для примера, скажите, равны ли два числа 1.999999998 и 1.999999991 ?
Для меня, как для инженера-математика, безусловно, не равны. Я, кончено, подозреваю, что Вы имеете ввиду случай побититового сравнения представлений этих чисел в 32 битных регистрах х86 совместимых процессоров... Ну так и задайте вопрос правильно, типа
"Какова точность кодирования мантиссы для формата данных single-pecision чисел с плавающей точкой в стандарте IEEE 754-1985 и как эта особенности сказывается на результате сравнения float переменных в различных реализациях С компиляторов"?

Для информации: на "равенство" этих чисел с точки зрения компилятора может влиять даже опции, с которыми производится компиляция.

Так что к сожалению, и тут Вы нам не подходите. Кроме того, у Вас присутствует симптомы известной серди разработчиков болезни "Floating point paranoia". Для своевременного принятия мер по её излечению настоятельно рекомендуется к прочтению эта статья http://habrahabr.ru/post/112953/.
Ну и позволю её кусочек тут процитировать: "Сейчас арифметика с плавающей запятой почти совершенна. Практически всегда наивный подход сработает, и программа, не учитывающая все ее особенности, выдаст правильный результат, а описанные подводные камни касаются только экзотических случаев".
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Март 16, 2015, 11:58 »

Если тезис про то что использовать == с double нежелательно звучит для вас бредом - могу пояснить на примере.
Приведите, с удовольствием послушаю. Добавлю что разница не только в этом - напр деление int на ноль выбрасывает исключение, а для флотов нет.

Так что же получается? Есть разница в типах, там кое-какие вещи обрабатываются по-разному, и значит (вот поэтому) темплейты здесь неуместны!

Это весьма слабый аргумент даже для такого "нелюбителя" темплейтов как я. Специализировать всего неск ф-ций - просто мелочь по сравнению с дубляжом десятков и десятков членов класса, 99% которых идеально совпадают. Да, и вот понадобится TPoint <float> (напр с OpenGL это вероятно), и что бум делать?

И еще позвольте спросить (RSATom, не Вас личнo, а всех участвующих). Ну а почему любое решение Qt считается правильным и идеальным? Почему так охотно отыскиваются аргументы "в одну сторону" а "в другую" не рассматриваются вообще?
Записан
RSATom
Гость
« Ответ #26 : Март 16, 2015, 12:06 »

К сожалению, Вы нам не подходите. Мы ищем специалиста по разработке приложений для микроконтроллеров/ПЛИС/GPU, где вообще нет целочисленных регистров и машинных команд для манипуляции целочисленными данными, а вся целочисленная арифметика реализована как частный случай операций над числами с плавающей точкой.

Подозреваю что и на равенство числа с плавающей точкой не сравниваются без допусков в этом случае? И кстати про ПЛИС у меня в резюме ни слова, странное что вы меня вообще на собеседование позвали...

Для примера, скажите, равны ли два числа 1.999999998 и 1.999999991 ?
Для меня, как для инженера-математика, безусловно, не равны. Я, кончено, подозреваю, что Вы имеете ввиду случай побититового сравнения представлений этих чисел в 32 битных регистрах х86 совместимых процессоров...

Нет, все гораздо тривиальней. Если я вам скажи что эти 2 числа это координаты пикселя на экране? В этом мы смело можем утверждать что эти числа должны трактоваться как эквиалентные.
Следующий вопрос: а эквивалентны ли  1.9 и 1.8?
Ответ: Иногда да, а иногда нет.
Да - если мы все еще оперируем координатами пикселя на экране.
Нет - если мы оперируем координатами пикселя на экране но например для SVG анимации.

Это я все к тому, что в случае с числами с плавающей точкой, размер допуска при сравнении может быть разный в зависимости от конкретного применения.
Записан
RSATom
Гость
« Ответ #27 : Март 16, 2015, 12:09 »

И еще позвольте спросить (RSATom, не Вас личнo, а всех участвующих). Ну а почему любое решение Qt считается правильным и идеальным? Почему так охотно отыскиваются аргументы "в одну сторону" а "в другую" не рассматриваются вообще?

Абсолютно не пытался утверждать что какое либо из решений правильное а другое нет, все в этом мире относительно. Единственное что я хотел сказать "серебряной пули" не существует. И если выигрываем в одном, проигрываем в другом.
Записан
Bepec
Гость
« Ответ #28 : Март 16, 2015, 12:14 »

to Igors:
Не все решения Qt правильные и идеальные. Те же View не идеальны и, я бы сказал, поверхностны.

А аргументы находятся, "потому что оно работает" ©.
Решения простые, низкий порог для понимания механизмов работы, возможность внесения исправлений. Оно работало, работает и будет работать. Мне лично нравится такой подход, пусть он и теряет в возможностях.

PS помнится я редактировал чужой проект, в котором шаблон на шаблоне сидел, лежал и кукарекал - у меня мозги чуть не спеклись Улыбающийся   
Записан
RSATom
Гость
« Ответ #29 : Март 16, 2015, 12:17 »

PS помнится я редактировал чужой проект, в котором шаблон на шаблоне сидел, лежал и кукарекал - у меня мозги чуть не спеклись Улыбающийся   

Оказывается есть даже такая болезнь: "Укушенный Александреску" Улыбающийся
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 23.