|
Заблокирован
|
||||||
Реализация аналога делегатов из C#09.10.2015, 19:22. Показов 2756. Ответов 17
Метки нет (Все метки)
я люблю писать велосипеды и я люблю c# и вот мне приспичило написать в c++ нечто по типу шарповых делегатов
в принципе это оказалось куда проще чем кажется но вот в одном месте выдает вот такую странную ошибку, не знаю что с ней делать ![]() бинарный "[": "std::list<int (__cdecl *)(int,int),std::allocator<_Ty>>" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору и вот код, ошибка на 17 и точно такая же на 18 строчках
0
|
||||||
| 09.10.2015, 19:22 | |
|
Ответы с готовыми решениями:
17
Реализация аналога CheckedListBox Реализация аналога категорий |
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 09.10.2015, 19:37 | |
|
В контейнере list нет оператора произвольного доступа (квадратных скобок), это же список.
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
| 09.10.2015, 19:45 | |||||||||||
Сообщение было отмечено Volrajas как решение
Решение
заменить:
1
|
|||||||||||
|
Заблокирован
|
|||
| 09.10.2015, 20:02 [ТС] | |||
![]() hoggy, не совсем то что нужно, мне же не надо чтобы последняя в списке функция выполнялась два раза, как сделать чтоб этого не было? она должна вернуть значение в return-е Добавлено через 11 минут ау люди как мне сделать цикл именно до предпоследнего элемента??? я реально не знаю чет вообще...
0
|
|||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||
| 09.10.2015, 20:07 | ||
|
0
|
||
|
Заблокирован
|
|||
| 09.10.2015, 20:10 [ТС] | |||
|
аа кажется понял, там просто ошибочка "--e", а надо "--end" и еще не "++i", а "++current", но когда я делаю "++current" у меня кидает ошибку
бинарный "++": не найден оператор, принимающий левый операнд типа "const std::_List_const_iterator<std::_List_val <std::_List_simple_types<int (__cdecl *)(int,int)>>>" (или приемлемое преобразование отсутствует) Добавлено через 54 секунды Добавлено через 1 минуту
0
|
|||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 09.10.2015, 20:11 | ||||||
|
Вообще проще будет не заморачиваться, а сохранять результат каждого вызова:
0
|
||||||
|
Заблокирован
|
|
| 09.10.2015, 20:11 [ТС] | |
|
и все таки интересно просто чем так плох дизайн?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 09.10.2015, 20:34 | ||||||||||
|
на с++ основной упор делается на класс (ООП). 2. решение потенциально не эффективно: везде все передается по значению. например: каноническая форма оператора присвоения знаете какая? но это все ладно. это детали реализации. самый главный фейл - дизайн использования. вот это только на выброс. вы вообще осознаете принцип использования вашего механизма? вот это - лютый фейл:
кроме одной, и в итоге поиметь непредсказуемый результат". вот здесь у вас - источник хаоса в программе. поведение будет меняться в зависимости от того, что запихали в делегат последним. то есть, вызывающая сторона (а их у вас несколько, потому что несколько клиентов могут покласть свои лаучеры в делегат) у вас должна постоянно париться, что там в делегате. и не дай бог, какой нибудь засранец затолкал не то, что нужно. и это уже само по себе нарушает не только принципы ООП: инкапсуляцию, инварианты. но и противоречит смыслу существования паттерна "делегат". делегат применяется для опосредованного запуска удаленной функции или функции-члена в условиях, когда вызывающая сторона не хочет знать, кого именно она дергает. а в вашем случае - источник постоянных ошибок, и знать ой как сильно придется.
0
|
||||||||||
|
Заблокирован
|
||||
| 09.10.2015, 21:07 [ТС] | ||||
|
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||
| 09.10.2015, 23:45 | |||||||||
|
http://rextester.com/FCM91730
потому что: 1. нужно предусмотреть стратегию оптимальной передачи возвращаемого значения. 2. возможность биндить аргументы. 3. оптимизация хранения функторов (std::shared_ptr оч не эффективное средство) 4. ещё вагон и тележка нюансов. хорошая новость в том, что у вас в распоряжении мощнейшая система изнасилования типов времени компиляции: метапрограммирования на шаблонах творит чудеса. все что понадобится - порешать ряд инженерных задач. делегат - это инструментальный механизм общего назначения. он предназначен для использования в самых разных проектах пользователей. просто подумайте о том, как предполагается использовать вашу версию делегата. ваш дизайн совершенно не практичен.
1
|
|||||||||
|
Заблокирован
|
||||||||
| 10.10.2015, 08:36 [ТС] | ||||||||
ладно буду разбираться боюсь не осилю я думал будет проще все это сделать... ну ладно посмотрим мож че и выйдет
0
|
||||||||
|
Администратор
|
||||
| 10.10.2015, 09:13 | ||||
0
|
||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 10.10.2015, 11:16 | |
|
0
|
|
|
Администратор
|
||
| 10.10.2015, 11:20 | ||
|
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 10.10.2015, 11:48 | ||
|
Если делать реализацию на С++03, то тут уже без привлечения платформо-зависимого API не получится, т.к. многопоточности в старых стандартах не было. Притом что код реализации этого на С++ вместе с, например, pthread будет не таким уж и сложным (в отличие от кода делегата, который на С++03 будет гораздо многословнее).
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||
| 10.10.2015, 15:53 | |||||||||||||||||||||||
|
рассмотрим функцию:
как и вызов напрямую. причем независимо от конфигурации сборки (не зависимо от режима оптимизаций компилятора) не факт, что sample умеет move-конструктор. и не факт, что компилятор сумеет оптимизировать RVO/NRVO возврат значения. (вижалстудия вообще не делает RVO/NRVO для дебага, например) я когда то делал делегаты c++03, принцип был следующий:
но если type - тип-значение, то конкретный лаунчер сохраняет его внутри себя, а наружу выкидывает ссылку. таким образом удалось решить проблему "избыточных копирований". в общем случае это не эффективно. здесь есть простор для разных стратегий оптимизаций. пользователь не должен вникать в детали реализации вашего делегата, и парить себе голову: не налажает ли он с передачей аргументов? когда у вас возникают сомнения - смотрите в сторону std::function.
и не иметь шрафных пенальти в рантайме. это значит, что вы не понимаете что такое "делегат", какова его "область применения", и каким вы видите "дизайн использования" вашего делегата. вы пытаетесь закодить без понимания сути решаемой задачи. и пока вы этого не поймете, имхо - нет смысла пытаться писать реализацию. Добавлено через 3 минуты
0
|
|||||||||||||||||||||||
|
Администратор
|
|
| 10.10.2015, 16:03 | |
|
0
|
|
| 10.10.2015, 16:03 | |
|
Помогаю со студенческими работами здесь
18
Sha1, реализация аналога php функции [WPF] Реализация аналога окна Сервис - Параметры из VS
Функции как параметры метода. (реализация с помощью делегатов) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|