|
7 / 7 / 3
Регистрация: 17.04.2014
Сообщений: 156
|
||||||
Как перегрузить методы, чтобы получились аналоги get set из C#12.10.2015, 22:15. Показов 7003. Ответов 75
Метки нет (Все метки)
Как можно перегрузить методы, что бы получился аналог get set из C#. Т.е. что то такое:
0
|
||||||
| 12.10.2015, 22:15 | |
|
Ответы с готовыми решениями:
75
Как сделать, чтобы из числа, допустим, 0,040005000 после 5 получились звёздочки Std::set с кастомным классом, как правильно перегрузить оператор < ? Как перегрузить методы Equals() и GetHashCode(), для сравнения свойств объектов? |
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||
| 17.10.2015, 00:47 | ||||||
|
Добавлено через 25 минут Добавлено через 8 минут Добавлено через 5 минут
0
|
||||||
|
710 / 284 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 17.10.2015, 00:58 | ||
|
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 17.10.2015, 01:21 | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 17.10.2015, 20:13 | ||
|
поэтому не могу точно сказать, что будет на выхлопе. однако я рассматривал реализацию std::function, его исходный код. изначально я предполагал обнаружить там type erasure, потому что не представляю себе, как ещё можно было бы реализовать функционал делегата. но каково же было мое удивление, когда я вообще не обнаружил там присутствия ключевого слова virtual за исключением класса эксепшена. который кидается, если попытаться запустить неинициализированный делегат. однако там присутствовали непонятные вызовы непонятных функций. и судя по знакам подчеркиваний в наименованиях - какие то расширения компилятора. однако, если отставить в сторону детали конкретной реализации. и глянуть на проблему с точки зрения логики, то очевидно жеж: 1. нужно уметь нацеливаться на разные функции. 2. нужно уметь перенацеливаться. 3. делать это можно в рантайме. очевидно, что при таких требованиях, единственный способ реализовать подобное можно только за счет указателя на функцию. то есть я хочу сказать: расширения компилятора - это не какое то волшебство. они так же вынуждены будут задействовать указатели. хотя я допускаю мысль, что если компилятор догадается, что делегат никуда не перенацеливается, а значит можно оптимизировать до прямого вызова без промежуточного указателя - он запросто может это сделать. во всяком случае я лично наблюдал случаи, когда компилятор оптимизировал вызов виртуального метода до прямого вызова функции потомка.
0
|
||
|
|
|||||||
| 17.10.2015, 20:26 | |||||||
|
Позвольте встрять..., но на простом примере GCC вроде бы без труда оптимизирует indirect call в direct call:
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 17.10.2015, 20:54 | ||||||||
|
но мне лень в этом разбираться. поэтому, я хочу, что бы привели пример-иллюстрацию. прямо здесь, кодом. я например, знаю, что дельфи умеет рефлексию. но с ограничениями: рефлексивными могут быть только особые классы, специальным образом унаследованные от специального класса. таким образом, это распространялось только на "виджеты", но не на "сам язык". подозреваю, что нечто подобное имеет место быть и в быдлере. это под капотом механизма и прозрачно для пользователей. я хочу сказать, что использование расширений компилятора в клиентском коде делает его не портируемым. использование же std::function - стандартно, и без каких либо изменений единообразно работает на любой платформе, которая поддерживает с++11 если можно поиметь профит такой же, как от расширений, но без расширений, то без расширений - это реальный профит. а с расширениями - только на отдельной платформе. как только захочется расширить рынок сбыта, и портануться на альтернативные платформы, сразу частоколом вылезут перпендикулярные проблемы, и профит обернется катастрофой. потому что данные-члены итак инкапсулированы в приватах. а сеттеры/геттеры для того и нужны, что бы вызывающая стороны могла безопасно получать/устанавливать данные. внутри этих функций инкапсулированы алгоритмы, которые обеспечивают инвариант класса. нафига их протектить? и понятия не имеете об их возможностях. вот вам для сведения: при переходе с++03 на с++11, основные изменения в ядре языка заронули именно механизм шаблонов. я приведу самый банальный пример: constexpr, decltype, auto. одни лишь эти средства преподнимают метапрограммирование на принципиально иной уровень. в с++17 нас ожидают концепты (уже доступны для гцц) и статическая рефлексия. на какие угодно наборы типов сообщений. и нет никаких ограничений по части перенацеливания. тобишь, в рантайме можно как подписываться, так и отписываться, так и назначать/переназначяать кастомные обработчики сообщений. можно например в зависимости от случайного числа сетить ту, или иную лямбду в качестве обработчика. в этом смысле статическая система сообщений позволяет все тоже самое, что и рантайм система сообщений. разница только лишь в том, что статическая умеет выполнять валидацию времени компиляции, и не тратит ресурсы машины на это времени выполнения. что и делает её более эффективной. однако мне хорошо известны детали реализаций множества различных моделей эвент-систем, их плюсы и минусы. и я прекрасно отдаю себе отчет почему рантайм системы не эффективны там, где с задачами прекрасно справляются статические модели. но вот насчет вас я не уверен. я просто не уверен, что вы понимаете какие инженерные задачи решают разработчики таких систем. Добавлено через 6 минут а "direct call" - это прямой вызов? в вашем случае по видимому компилятор догадался, что делегат никуда не перенацеливается. и то вообще от замены на прямой вызов, никакие побочные эффекты не изменятся. собственно, я наблюдал ситуацию, когда примерно по такой же схеме компилятор заменял вызов виртуальной функции на прямой вызов функции потомка.
0
|
||||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 17.10.2015, 20:57 | |||
|
Ну так и быть разъясню - direct call - операнд - адрес вызываемой функции indirect call - операнд указатель на адрес вызываемой функции.
0
|
|||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 17.10.2015, 21:17 | ||
|
Множественные получатели с контролем жизненного цикла подписчика на __closure собираются за час, при этом разработчик решает какой механизм слежения за жизненным циклом подписчика использовать. Ну а Reflection дает возможность простого построения редактора взаимосвязей пользователем в рантайме.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 17.10.2015, 21:42 | |||||||
|
ясен перец, ежели это - синтаксический сахар над указателем-на-функцию-член, стало быть валидируется он точно так же, как и указатель-на-функцию-член. я вам выше предложил продемонстирровать, как вы со своим __closure сможете реализовать очередь задач. задача - некоторая функция, которая может принимать аргументы. при создании задачи можно указать с какими аргументами её нужно позвать когда то в будущем. и это - не какой то редкий юзкейс, а очень распространенная задача. именно по этой причине узаконили бинды, и именно по этой причине лямбды умеют захватывать контекст. если бы этого не сделали, то те же лямбды оказались бы такими же ущербными, как и ваш __closure который ласоснёт по полной при попытке порешать подобную задачу. сто лет назад они были в boost но поскольку они оказались очень востребованными, то с++11 их узаконил. и теперь они есть в std при этом лямбды были реализованы на уровне ядра языка. при этом я вообще не использовал ни делегатов, ни указателей-на-функции-члены. например, бустовские сигналы любят смартпоинтеры. однако с++ далеко не формошлепка. и одной лишь формошлепкой не ограничивается. более того, с оглядкой, например, на qt, видно, что для создания удобной и простой формошлепки, Reflection не является необходимостью. для CEGUI например, можно вообще описывать виджеты в xml. а редактор умеет цеплять их в рантайме. вы же это так преподносите, словно без рефлексии создать фомошлепку невозможно в принципе. что есть противоречие фактам реальной жизни.
0
|
|||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 17.10.2015, 21:55 | |||
|
Т.е. простейший пример - есть набор линий точек окружностей. Нужно их поредактировать c возможностью добавления удаления/перемещения. Будем под каждый тип объекта форму шлепать или свой велосипед в сторону рефлекшина городить? Еще пример - банально триггер в игровом движке (хотя то же касается и вообще движков моделирования), который надо добавить/удалить/связат с датчиками и подписчиками в редакторе уровня/сохранить в фал/прочитать из файла вместе со всеми назначченными событиями. Опять будем огород городить в духе либо кучи формошлепства либо велосипедить рефлекшин? Добавлено через 4 минуты
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 17.10.2015, 22:21 | ||||||
|
чем вам не угодил какой нибудь std::map<property-name, value>? ну или, если так париспичило что-то более извращенное, то variant ? поимев вариант, вы сможете для обычного неполиморфного класса создавать любые свойства, любой сложности. причем времени выполнения. тобишь редакторы это схавают на раз. и разработчики qt предпочли заложиться на собственный велосипедный мок-процессор, нежели на стандарт. в настоящий момент необходимость в моке отпала. и многие вещи реализованы с использованием стандартной библиотеки. например, их оригинальные слот-сигналы валидировали времени выполнения. что плохо отразилось на эффективности (медленно они работают) но позже, когда стандарт устаканился, они добавили функционал std::function, поимев профит времени компиляции. я не вижу ни одной причины ни для рефлекшена, ни для каких то порождений новых типов, ни для порождений новых форм. как начнут обрабатываться все прочие юзерские события. нахрена тут рефлекшен? куда уж там до boost. а то что Embarcodero не держит его в коробке - это нормально. никто не держит boost в коробке "просто что б был".
0
|
||||||
|
710 / 284 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||
| 17.10.2015, 22:33 | ||||
|
0
|
||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||||
| 17.10.2015, 23:35 | |||||||
|
Т.е. достаточно в классе указать список свойств, а обрабатывать ввод/вывод извне можно не размазывая по всем классам, причем чем больше типов ввода-вывода тем больше размазывать, а компактным универсальным внешним кодом для каждого из видов(направлений) ввода-вывода. Добавлено через 18 минут Добавлено через 11 минут Добавлено через 12 минут Добавлено через 13 минут Те же кстати ошибки в списках доступа пропертей ловятся довльно тяжко, если сигнатура геттера или сеттера подошла. А вы предлагаете еще использовать лисопед с заданием списков несколько раз, и скорее всего без проверки сигнатуры. Кстати Embarcodero начала синтаксис пропертей двигать. В XE8 начали работать унарные операторы в духе ++ и +=. что в XE10 еще не видел, но похоже дело идет к ссылкам на свойства. Это еще гораздо больше все упростит.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 18.10.2015, 16:37 | |||||||
|
а просто пользоваться уже готовым механизмом. если чел не осилил STL, стало быть он языка не знает. и как бе разговаривать с ним особо не о чем. например, описал в обычном xml документе виджет для CEGUI. я ж никаких std::map руками не правил. однако все нужные свойства сами как то образовались в редакторе. там где то глубоко под капотом самой библиотеки наверняка есть какая то мапа. только следить за ней в ручную не нужно. об этом позаботится движок. цемес же был за то, что вы там выше вещали, мог без рефлексии создание становится в принципе не возможным. но покамест я наблюдаю лишь то, что благодаря рефлексии некоторые вещи становятся проще. но не более того. а кроме того, для рантайм рефлексии так же важен вопрос цены. это может быть удобно, но не слишком эффективно с точки зрения затрат ресурсов машины.
0
|
|||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||||||||
| 19.10.2015, 07:11 | ||||||||||||
|
Добавлено через 1 минуту Добавлено через 15 минут Добавлено через 43 минуты Добавлено через 16 минут Добавлено через 1 час 4 минуты Buileder генерит подобную таблицу сам и все это хранит с скомпилированном коде наподобие vmt, при этом в фреймверк входят функции чтения этой таблицы в рантайме. Т.е. дальнейшее развитие classid необходимость в котором комитет только узрел, а борланд уже 20 лет как всю эту концепцию развил на полную глубину ее возможностей. Было бы неплохо стандартизировать все это чтобы доступ к таблице осуществлялся не библиотекой а операторами языка. Добавлено через 26 минут У билдера это "что-то" ложится под капот моего кода (вернее даже не ложится под капот а вешается на замок подвески), в результате я имею возможность сделать в своем приложении полиморфный редактор созданных мной объектов, описывающих предметную области задачи без всякого геммороя, при этом приделать один раз полиморфный код сериализации/десериализации этих объектов, а расширять их иерархию уже не парясь ни о сохранении ни о загрузке ни о привязывании к визуальному редактору и т.д, при этом в коде обработки взаимодействия этих созданных классов бизнес-логики, пользуя абсолютно штатные вызова методов без всякого поиска по имени и т.п. Добавлено через 3 часа 5 минут Добавлено через 5 часов 48 минут
0
|
||||||||||||
| 19.10.2015, 07:11 | |
|
получить все комбинации по парам x y, чтобы получились следующие массивы Из каждого предложения удалить знаки препинания чтобы получились лексемы Как перегрузить оператор = , чтобы ф-ция была дружественной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|