Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Если вы не против, задам ещё пару вопросов по C++ Как написать for по контейнеру указателей на функции? С псевдонимами получается так и все работает: Код: plaintext 1. 2. 3. 4. 5. А если я хочу без using: Код: plaintext 1. 2. 3. 4. Имеется что-то вот такое Код: plaintext 1. 2. 3. При этом arr создается без проблем, а вот оператор new обязательно требует указать какое-нибудь число в размерность. Причем, как я вижу в отладчике, по факту все равно создается массив именно размера 20, независимо от того, что за число написано в new. Так может тогда есть возможность выделять память с помощью new в таких случаях без указания бесполезного числа? Или оно все же несет какой-то смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 08:40 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Ржавый гвоздьА если я хочу без using: Код: plaintext 1. 2. 3. 4. Попробуй for (int(* item )(int, int) : funcVect) А вообще, к чему эти непотребства, когда есть auto ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 10:10 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Ржавый гвоздьПри этом arr создается без проблем, а вот оператор new обязательно требует указать какое-нибудь число в размерность. Причем, как я вижу в отладчике, по факту все равно создается массив именно размера 20, независимо от того, что за число написано в new. Так может тогда есть возможность выделять память с помощью new в таких случаях без указания бесполезного числа? Или оно все же несет какой-то смысл? Попробуй с reinterpret_cast ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 10:29 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZ, да, for (int(*item)(int, int) : funcVect) работает спасибо. С auto понятно, я просто C++ изучаю, так что все эти непотребства исключительно в образовательных целях. NekZПопробуй с reinterpret_cast А вот здесь не понял, что к чему предлагаешь кастовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 12:30 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Ржавый гвоздьА вот здесь не понял, что к чему предлагаешь кастовать? Код: plaintext 1. На будущее, лучше используй std::array, с ним меньше путаницы в таких случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 12:34 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Спасибо, разобрался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2018, 16:05 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZА вообще, к чему эти непотребства, когда есть auto ?вот зачем учить человека плохому? Человек правильно делает, использует using. Не надо тут использовать auto. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 05:08 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMbвот зачем учить человека плохому? Человек правильно делает, использует using. Не надо тут использовать auto. Я напоминаю, что auto (как и любые другие фичи языка) было внесено в язык единогласно всем комитетом по стандарту. Вот такие злые люди - специально нагадили всему миру, зная что учат его плохому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 07:18 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Мммм... Похоже, старички-то начали возмущаться. Как и во время добавления классов в C, история-то повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 08:01 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZ, auto, reinterpret_cast - жуткие вещи, если без них можно обойтись, то лучше обойтись без них. и второе и первое ввели для очень узких целей, а не для промышленной эксплуатации как сейчас "советует" мелкософт для auto ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 08:26 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Насчёт reinterpret_cast, согласен, это признак вынужденного костыля, без которого в некоторых случаях не обойтись. А вот auto в range-based loop'е очень даже удобен. Не нужно тебе конкретно знать что хранится в контейнере и не придётся менять код ещё в одном месте при смене типа элементов, хранящихся в контейнере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 08:57 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Ржавый гвоздьЕсли вы не против, задам ещё пару вопросов по C++ Как написать for по контейнеру указателей на функции? С псевдонимами получается так и все работает: Код: plaintext 1. 2. 3. 4. 5. А если я хочу без using: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Без using вряд ли стоит хотеть это делать. Ржавый гвоздь Имеется что-то вот такое Код: plaintext 1. 2. 3. При этом arr создается без проблем, а вот оператор new обязательно требует указать какое-нибудь число в размерность. Причем, как я вижу в отладчике, по факту все равно создается массив именно размера 20, независимо от того, что за число написано в new. Так может тогда есть возможность выделять память с помощью new в таких случаях без указания бесполезного числа? Или оно все же несет какой-то смысл? Не понятно, как ты это мог видеть в отладчике. Размер созданного динамически объекта не виден программе. Оператор new обязательно требует указать какое-нибудь число в размерность только при создании массива, что вполне логично. Ты создаёшь массив массивов. Зачем -- тебе виднее. У тебя два варианта. 0) ты хочешь создать массив массивов, тогда тебе НУЖНО указывать ещё одну размерность. Это требует язык и это вполне логично. 1) ты хочешь создать один объект типа arraytype, т.е. просто динамически созданный массив из 20 элементов. Тогда тебе не нужно указывать размер. Но тогда тебе не нужно указывать квадратные скобки в типе создаваемой переменной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 10:54 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMbNekZА вообще, к чему эти непотребства, когда есть auto ?вот зачем учить человека плохому? Человек правильно делает, использует using. Не надо тут использовать auto. Почему бы для объявления типа элемента в цикле range for не использовать auto? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 10:55 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZkealon(Ruslan), Насчёт reinterpret_cast, согласен, это признак вынужденного костыля, без которого в некоторых случаях не обойтись. А вот auto в range-based loop'е очень даже удобен. Не нужно тебе конкретно знать что хранится в контейнере и не придётся менять код ещё в одном месте при смене типа элементов, хранящихся в контейнере. Да хуже. reinterpret_cast тут просто нафиг не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2018, 10:56 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЯ напоминаю, что auto (как и любые другие фичи языка) было внесено в язык единогласно всем комитетом по стандарту.И очень классно сделали. Потому без auto некоторые вещи невозможно сделать в шаблонах или на порядок труднее, чем с auto. И это не значит, что надо ставить его везде, где можно: auto нужен там, где вы не можете явно выписать тип. Где можете - там выписывайте, используйте using, если нужно . NekZКак и во время добавления классов в C, история-то повторяется.Ты не разобрался в вопросе, а сделал вывод. NekZА вот auto в range-based loop'е очень даже удобен. Не нужно тебе конкретно знать что хранится в контейнере и не придётся менять код ещё в одном месте при смене типа элементов, хранящихся в контейнере.возьми using, тебе тоже не придётся менять код ещё в одном месте. Зато в случае, если ты поменяешь что-то в контейнере, using тебе об этом напомнит, а auto нет. Не поленись, напиши один раз using, это сэкономит время тебе и твоим коллегам в будущем, при отладке и просто чтении кода. MasterZivПочему бы для объявления типа элемента в цикле range for не использовать auto?потому что там явно можно указать тип. читать код с auto - неудобно. и на этом форуме и на других я видел много ошибок, связанных с auto, как правило потому что вывод типов программиста и вывод типов компилятора отрабатывают по-разному , т.е. проблема не в auto, проблема в человеках. Где-то было даже примитивное auto x = u, где u - было выражение, возвращающее unsigned int, а автор работал с ним, как с int. Думал, что это int. И три страницы поиска ошибки. А ведь, блин, int написать короче, чем auto! Это уже пагубная привычка, друзья ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 05:29 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMbвозьми using, тебе тоже не придётся менять код ещё в одном месте. Зато в случае, если ты поменяешь что-то в контейнере, using тебе об этом напомнит, а auto нет. Не поленись, напиши один раз using, это сэкономит время тебе и твоим коллегам в будущем, при отладке и просто чтении кода. using чего? Элемента? Или полностью всего контейнера? Если первое, то вопрос всё равно останется, и если мне из эстетических соображений захочется поменять само имя using'а, то придётся менять его не только в контейнере, но ещё и в каждом последующем цикле, который итерируется по этому контейнеру. То же самое касается и using'а на весь контейнер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 07:54 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMbчитать код с auto - неудобно. и на этом форуме и на других я видел много ошибок, связанных с auto, как правило потому что вывод типов программиста и вывод типов компилятора отрабатывают по-разному , т.е. проблема не в auto, проблема в человеках. Где-то было даже примитивное auto x = u, где u - было выражение, возвращающее unsigned int, а автор работал с ним, как с int. Думал, что это int. И три страницы поиска ошибки. А ведь, блин, int написать короче, чем auto! Это уже пагубная привычка, друзья Современные IDE давно умеют показывать тип, если навести курсор на auto, благо теперь для этого есть средства в виде целого мешка инструментов clang*, так что, разработчикам IDE не нужно об этом сильно волноваться. Мало того, неправильное использование числовых типов, как в том случае, ведёт к предупреждениям от компилятора и даже IDE, и не надо говорить, что их никто не читает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 08:13 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZusing чего? Элемента? Или полностью всего контейнера?если я работаю с каким-то типом, я завожу два-три, под сам тип(shared_ptr<T>), под контейнер и под итератор. При этом тип упоминается 1 раз. NekZЕсли первое, то вопрос всё равно останется, и если мне из эстетических соображений захочется поменять само имя using'а, то придётся менять его не только в контейнере, но ещё и в каждом последующем цикле, который итерируется по этому контейнеру.ну это как-то странно, что твои эстетические соображения меняются так часто, что тебе становится это проблемой. Обычно, если ты работаешь в команде (да и один тоже, как я, например) вы приходите к некоторым соглашениям по нотации и стилю кода, так? И в течении всего проекта это никак не меняется. NekZСовременные IDE давно умеют показывать типда, осталось дождаться, когда они за нас ещё программы писать будут. Ценность программиста определяется не только тем, что он умеет пользоваться мышкой, но больше тем, что он понимает, что и зачем он делает. Я, например: 1. Понимаю, зачем добавлен auto 2. Вижу по форумам, что возникает довольно много (глупых) ошибок из-за того, что людям лень писать тип. И у всех у них IDE, который мышкой показывает тип auto. Проблема не в IDE, проблема в людях. Я не говорю, что нельзя, я говорю, что лучше так не делать, потому что чревато ошибками. NekZМало того, неправильное использование числовых типов, как в том случае, ведёт к предупреждениям от компилятора и даже IDE, и не надо говорить, что их никто не читает.я читаю. Но вот в случае auto i = u, i--; предупреждения не будет, и программа выполнит то, что программист написал, а не то, что он подумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 08:55 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZ Мало того, неправильное использование числовых типов, как в том случае, ведёт к предупреждениям от компилятора и даже IDE, и не надо говорить, что их никто не читает.1-е - фантазии ... Нефига он ничего нормально не показывает, переводил очень много либ с численными расчётами на дельфю - столько варнингов выскакивало с контролем типов, а студия позорно молчит Для прочувствования всей опы надо годик-другой баги половить в чужом коде. Судя по текущей ситуации с auto цветочки уже выросли ещё больше чем с reinterpret_cast, что довольно закономерно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 09:01 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMbесли я работаю с каким-то типом, я завожу два-три , под сам тип(shared_ptr<T>), под контейнер и под итератор. При этом тип упоминается 1 раз. Вот именно от подобного бойлерплейта и стараются избавляться в новых стандартах. Более того Вандевурд в докладе на C++ Russia 2018 показывал сколько ещё хотят навернуть компайл-тайм фич для кодогенерации на основе информации о типе аля meta_type. Язык в языке образуется. Выглядит как адЪ, но это современные тенденции и нужно принимать их, если не пропозишь в комитет, постоянно борясь с этим новым извратом. CEMbну это как-то странно, что твои эстетические соображения меняются так часто, что тебе становится это проблемой. Обычно, если ты работаешь в команде (да и один тоже, как я, например) вы приходите к некоторым соглашениям по нотации и стилю кода, так? И в течении всего проекта это никак не меняется. А нотации здесь нипричём, может, мне просто имя не понравилось, не отражающее сути типа. Ведь бывает же такое, в процессе рефакторинга? CEMbда, осталось дождаться, когда они за нас ещё программы писать будут. Ценность программиста определяется не только тем, что он умеет пользоваться мышкой, но больше тем, что он понимает, что и зачем он делает. Я, например: 1. Понимаю, зачем добавлен auto 2. Вижу по форумам, что возникает довольно много (глупых) ошибок из-за того, что людям лень писать тип. И у всех у них IDE, который мышкой показывает тип auto. Проблема не в IDE, проблема в людях. Я не говорю, что нельзя, я говорю, что лучше так не делать, потому что чревато ошибками. Если можно автоматизировать какую-то рутинную часть разработки, разгрузив голову, то почему это не доверить автоматическим средствам, которые меньше допускают ошибок, нежели сам человек? Выкрутить уровень предупреждений на максимум, настроить тулзины, линтеры от clang'а (хотя бы на уровне CI). Ведь, куда лучше, программировать, а не решать постоянно технические проблемы в борьбе с инструментом, держать их все в голове. Можешь перейти на Rust, он тебе вообще чихнуть не даст в случае чего. CEMbя читаю. Но вот в случае auto i = u, i--; предупреждения не будет, и программа выполнит то, что программист написал, а не то, что он подумал Так и в случае без auto тоже предупреждения не будет :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 13:40 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)1-е - фантазии ... Нефига он ничего нормально не показывает, переводил очень много либ с численными расчётами на дельфю - столько варнингов выскакивало с контролем типов, а студия позорно молчит Для прочувствования всей опы надо годик-другой баги половить в чужом коде. Судя по текущей ситуации с auto цветочки уже выросли ещё больше чем с reinterpret_cast, что довольно закономерно. Студия? ХЗ, если ошибки сравнения, приводящие к неявному промоутингу типов, то, скорее, зависит от уровня предупреждений, который выставлен в настройках проекта студии. Пробовал на gcc с -Wall? Для этого достаточно заюзать godbolt.org для прототипирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2018, 13:47 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZВот именно от подобного бойлерплейта и стараются избавляться в новых стандартах.Не надо от этого избавляться. Я завёл свои прототипы, и смотрю в код, я сразу вижу, где какие типы. Это сильно отличается от того, когда стоят auto, и тебе приходится смотреть вправо, чтобы провести парсинг в голове. Это, может, и полезно для ума, да :) Но неудобно. Я пишу "два-три" - это плюс тип контейнера и итератора. Сам тип упоминается в using-ах один раз. Я могу в коде писать vector<U> или vector<U>::iterator, где U - это using that_type = ..., а могу использовать дополнительные using-и. Я их один раз определил, я всегда по нотации пойму, что это. И занимает оно 3-6 символов в среднем. И в том и в другом случае, если мне надо поменять тип объекта, я делаю это в одном месте. NekZБолее того Вандевурд в докладе на C++ Russia 2018 показывал сколько ещё хотят навернуть компайл-тайм фич для кодогенерации на основе информации о типе аля meta_type. Язык в языке образуется. Выглядит как адЪ, но это современные тенденции и нужно принимать их, если не пропозишь в комитет, постоянно борясь с этим новым извратом.А можно на это где-то посмотреть? Шаблоны - тоже язык в языке, но очень удобно. NekZА нотации здесь нипричём, может, мне просто имя не понравилось, не отражающее сути типа. Ведь бывает же такое, в процессе рефакторинга?Бывает, но это не бывает при каждом рефакторинге, так ведь? 1-2 раза за проект это нормально. Больше - надо серьёзно задуматься :) NekZЕсли можно автоматизировать какую-то рутинную часть разработки, разгрузив голову, то почему это не доверить автоматическим средствам, которые меньше допускают ошибок, нежели сам человек? auto - это не совсем автоматизация. Это означает, что ты доверяешь вывод типов компилятору. И это не гарантирует, что компилятор выведет то, что ты подразумеваешь. Автоматизация, это когда компилятор или IDE или раб делают именно то, что ты подразумеваешь. У меня есть тул, который, по комбинации кнопок вставляет в код шаблон конструкции или большое ключевое слово целиком, или выполняет ряд каких-то действий - вот это автоматизация, оно делает именно то, что я подразумеваю, поэтому ошибок тут нет. NekZВедь, куда лучше, программировать, а не решать постоянно технические проблемы в борьбе с инструментом, держать их все в голове.Да, для этого есть using. И, да, лучше программировать, чем постоянно по коду лазить и вспоминать, какой тип у этого auto, а какой у этого. Ладно, когда это for(:), а когда это f()? И мне, например, не хочется каждый раз мышой подсвечивать сигнатуру. я просто хочу донести свою мысль. auto создавалось для случаев, когда сделать вывод типов без auto нельзя . И это хорошо. А его используют везде , где только можно. И это плохо. для аналогии: скальпель нужен для случаев, когда другими способами устранить болезнь нельзя. А теперь его пытаются использовать для лечения всех болезней, даже насморка. И тут как бы видно, что это ведёт к многочисленным ошибкам. С тем же насморком, например, страшно представить... :) Суть программирования - заменить много действий одним. Для этого должен существовать изоморфизм между кодом и наименованиями. Так вот повсеместное использование auto слегка рвёт этот принцип. NekZТак и в случае без auto тоже предупреждения не будет :-)А если так: NekZВыкрутить уровень предупреждений на максимум, настроить тулзины, линтеры от clang'а (хотя бы на уровне CI)то будет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2018, 05:54 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
CEMb, Ох, лень всё перецитировать, как же это неудобно. Записи докладов с C++ Russia 2018 будут доступны где-то через месяц. По поводу auto, это дело вкуса, кто-то может положиться на себя и коллег и писать его где считает разумным, включая range-based loops, кто-то хочет всё явно указывать. Но эволюцию языка не остановить. Например, Эрик Ниблер уже во всю пропозит свою Range Library . Уж там-то всё на auto, замучаешься писать типы :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2018, 06:23 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
NekZ Код: plaintext 1. На помойку http://eel.is/c draft/expr.new#1.sentence-8 If it is an array, the result of the new-expression is a pointer to the initial element of the array. http://eel.is/c draft/basic.compound#4.sentence-2 http://eel.is/c draft/basic.compound#4.note-1 If two objects are pointer-interconvertible, then they have the same address, and it is possible to obtain a pointer to one from a pointer to the other via a reinterpret_cast. [Note: An array object and its first element are not pointer-interconvertible, even though they have the same address. — end note] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 16:59 |
|
||
|
Псевдонимы типов
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCEMbвот зачем учить человека плохому? Человек правильно делает, использует using. Не надо тут использовать auto. Я напоминаю, что auto (как и любые другие фичи языка) было внесено в язык единогласно всем комитетом по стандарту. Вот такие злые люди - специально нагадили всему миру, зная что учат его плохому Простите, не сдержался... :) Тынц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2018, 15:57 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39644760&tid=2017858]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 291ms |
| total: | 437ms |

| 0 / 0 |
