|
7 / 7 / 3
Регистрация: 17.04.2014
Сообщений: 156
|
||||||
Как перегрузить методы, чтобы получились аналоги get set из C#12.10.2015, 22:15. Показов 6430. Ответов 75
Метки нет (Все метки)
Как можно перегрузить методы, что бы получился аналог get set из C#. Т.е. что то такое:
0
|
||||||
| 12.10.2015, 22:15 | |
|
Ответы с готовыми решениями:
75
Как сделать, чтобы из числа, допустим, 0,040005000 после 5 получились звёздочки Std::set с кастомным классом, как правильно перегрузить оператор < ? Как перегрузить методы Equals() и GetHashCode(), для сравнения свойств объектов? |
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||
| 17.10.2015, 00:47 | ||||||
|
Добавлено через 25 минут Добавлено через 8 минут Добавлено через 5 минут
0
|
||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 17.10.2015, 00:58 | ||
|
0
|
||
|
2083 / 1575 / 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 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 17.10.2015, 20:57 | |||
|
Ну так и быть разъясню - direct call - операнд - адрес вызываемой функции indirect call - операнд указатель на адрес вызываемой функции.
0
|
|||
|
2083 / 1575 / 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 / 1575 / 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 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||
| 17.10.2015, 22:33 | ||||
|
0
|
||||
|
2083 / 1575 / 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 / 1575 / 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 | |
|
Помогаю со студенческими работами здесь
76
получить все комбинации по парам x y, чтобы получились следующие массивы Из каждого предложения удалить знаки препинания чтобы получились лексемы Как перегрузить оператор = , чтобы ф-ция была дружественной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|