|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
||||||
Странная запись при передаче флагов как параметров в функцию06.08.2015, 10:55. Показов 2370. Ответов 13
Метки нет (Все метки)
Здравствуйте.
Возникла необходимость использования функции StringReplace в коде и я обнаружил, что флаги в качестве аргументов в ней передаются следующим образом: TReplaceFlags() << rfReplaceAll << rfIgnoreCase. Т.е. в коде это выглядит так:
Что означает такая запись?
0
|
||||||
| 06.08.2015, 10:55 | |
|
Ответы с готовыми решениями:
13
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? Не понятный баг при передаче параметров в функцию При передаче ссылки на массив в функцию перестает работать запись |
|
Супер-модератор
|
|
| 06.08.2015, 11:29 | |
Сообщение было отмечено Kirill R как решение
Решение
Она означает, что в С++ нет типа "множество", оно лишь имитируется, и для удобства перегружены операторы << (для добавления элемента во "множество") и >> (для удаления элемента из "множества"). То есть, запись, фактически, означает:
"Создать экземпляр класса TReplaceFlags и внести в него элементы rfReplaceAll и rfIgnoreCase"
1
|
|
|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
|
| 06.08.2015, 11:39 [ТС] | |
|
Но ведь это можно было сделать списком, либо массивом, либо просто сделать переменным число аргументов. Не знаете, почему был выбран именно такой вариант?
На мой взгляд, создание отдельного класса и перегрузка операторов - нетривиальная задача...
0
|
|
|
Супер-модератор
|
||
| 06.08.2015, 11:48 | ||
|
Для пользователя удобнее именно такой вариант, если было бы массивом - пришлось бы описывать массив отдельно, и потом его передавать в функцию. Аналогично и со списком. А подобная перегрузка (ее не нужно делать, она уже сделана разработчиками, так что тривиальна или нет сама перегрузка - неважно, важно, что тривиально ее использование) позволяет прямо в нудном месте создать класс, и заполнить его нужными значениями, без необходимости выносить заполнение в отдельную строку текста программы.
Добавлено через 1 минуту TReplaceFlags() << rfIgnoreCase << rfReplaceAll ? Мне что, переучиваться?
1
|
||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
||||||
| 06.08.2015, 11:59 | ||||||
Сообщение было отмечено Kirill R как решение
Решение
StringReplace требует четвертым параметром объект типа TReplaceFlags. Чтобы не создавать отдельно этот объект, запись ужимается вот до такого вида, что ухудшает понимание. TReplaceFlags() - со скобочками - это вызов конструктора объекта. То есть такой записью в четвертом параметре StringReplace создается безымянный объект соответствующего типа, в который, посредством перегруженного оператора <<, передаются значения, флаги, какие следует установить. Полученный таким образом временный безымянный объект типа TReplaceFlags будет уничтожен по выходу из функции замены символа.
Все это можно было б нагляднее записать вот так:
1
|
||||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
||
| 06.08.2015, 12:09 | ||
|
1
|
||
|
Супер-модератор
|
||
| 06.08.2015, 12:10 | ||
|
1
|
||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 12:32 | |
|
volvo, Сомневаюсь, что решающим фактором для представления делфийского множества в виде класса Set, а не какого-нибудь массива, было исключительно удобство. Если бы даже массивом было удобнее, то через него нельзя было бы передавать этот параметр, потому что функция StringReplace ожидает множество, а ставить для C++ знак тождества между делфийскими массивом и множеством - это не очень хорошо. Сама реализация неплохая, разве что можно было бы это все сопроводить каким-нибудь синтаксическим сахаром, которого в билдере хватает, но сотрудники Борланда решили этого не делать.
1
|
|
|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
|
| 06.08.2015, 13:45 [ТС] | |
|
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 14:03 | |
|
Kirill R, допустим, свойства. В C++ их нет, в Delphi есть, и в C++ Builder'е они тоже есть, чтобы обеспечить совместимость с классами VCL, реализованных в Object Pascal'е.
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 14:24 | |
|
volvo, это был ответ на то, что я подразумеваю под синтаксическим сахаром. К StringReplace отношения не имеет.
0
|
|
|
Супер-модератор
|
|
| 06.08.2015, 14:39 | |
|
В таком случае зачем говорить о синтаксическом сахаре, если он вообще не имеет отношения к обсуждаемому вопросу? Я еще раз повторяю, что именно удобство для пользователя было основным фактором выбора перегрузки операций для работы с псевдомножествами. Там выше было возражение, что можно было бы это все сопроводить каким-либо синтаксическим сахаром. Оказывается, разговор был вообще ни о чем? К чему тогда сотрясать воздух непонятными высказываниями? Чтобы только опровергнуть чужое мнение? Только в моем случае это не проходит. Я не первый год вижу вот таких "опровергателей", и прекрасно изучил их повадки.
По делу есть что сказать? Какой еще "сахар" может позволить более удобно работать с аналогом множеств в С++? Конкретные примеры вызовов, пожалуйста, приводите, а не просто размышления "если бы вот сюда прилепить вот эту фигню, и если еще этот самолет взлетит - то было бы круто"...
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 15:27 | |
|
volvo, то есть, вы хотите сказать, что, во-первых, в C++ Builder множества реализованы удобнее, чем в Dephi, так как в C++ Builder используется перегрузка операторов, а в Delphi нет? А, во-вторых, если бы в C++ можно было бы записывать массив, как в C# (TReplaceFlag[]{rfReplaceAll, rfIgnoreCase}), то в Борланде не стали бы городить свой класс на замену множеств, а использовали бы для этих целей массивы?
0
|
|
| 06.08.2015, 15:27 | |
|
Помогаю со студенческими работами здесь
14
Ошибка при передаче параметров в функцию. Объясните, ребят, пожалуйста, в чем ошибка Как наиболее правильно (или корректно) должна выглядеть строка запроса при передаче в скрипт параметров?
Странное поведение при передаче параметров Ошибка при передаче параметров в подпрограмму Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|