из извлекать (типо +=/-= в с# эвентах), только через new?
Список функций? std::vector<std::function<void(void)> Если про делегаты, то в плюсах их нет
Ну std::vector например возми..
И как от туда удалять? Если std:: function использовать?
Непонятно что вы хотите и для чего
C# подобный эвент тупо
Функции(std::function) на равенство нельзя проверять
Не надо задавать вопросы в стиле "как мне на А сделать как в Б"
Я не говорил про std function
Ну а что хранить в векторе тогда? Указатели на функции?
Да, меня бы это в вполне устроило
Не знаю, мне бы еще лямбд хотелось впихивать в качестве коллбеков
Хотя они кастятся к указателю если состояния не хранят
Человек спрашивал про функции.
(Как в C#)
Можешь взять Qt и не париться
Кроме того, надо - ну сделай ты отдельный объект врапер для функции и идентификатора. Со сравнением.
Я на телефоне программирую у меня только стдлиба
Идентификатор брать откуда-то надо, а глобальный счетчик заводить не хочется
А лямбды ты никуда не поместишь, они разного типа
Что взять за индетификатор? Индекс в массиве, а если я стер, надо перемапить индексы а это О(Н)?
Это не твои уже проблемы
Адрес функции например
А что пишешь на телефоне вообще? Для чего эвенты понадобились
"Безумству храбрых поём мы пестню!"
Очень опасно, лямбду лучше бы копировать в этом случае
А как жизнь до того дошла что на телефоне надо писать?
Да нормас пока в метро едешь спустя пару месяцев довольно большой проект получается
Что опасного, я не понял...
Каждая лямбда обладает своим собственным, уникальным типом данных. Ни в массив, ни в вектор, ни в какой другой контейнер нельзя поместить лямбду. Можно взять адрес лямбды (хотя думаю, это запрещено) и положить в void* Но тогда когда ты из void* вытащишь этот адрес, его надо преобразовать к типу лямбды, а ты его НЕ ЗНАЕШЬ. Так что никаким образом лямбды нельзя для этого использовать. Можно использовать лямбды без захвата с одной сигнатурой. Да, можно. Но это , по сути, частный случай функции с этой же сигнатурой.
std::vector<std::unique_ptr<Event>>, где Event - абстрактный интерфейс для Callable объектов, вас не устроит?
Ну это с new уже, это не оч удобно, хотя похуй, выбора нет
Тоже кстати вариант, и неплохой.
И побыстрее, наверное
Можно в std::function складывать. Можно еще упароться по тайпклассам и dyno заюзать(но это для извращенцев). Остается только знать сигнатуру. Ну и идентификаторы откуда-то доставать.
Вряд ли
std::function может функции или с маленьким стейтом на куче не выделять
Это круто. Расскажи поподробнее ! А какую графическую подсистему ты используешь ? OpenglES или что то другое может уже придумали
Стирание типа ведь через хелперы абстрактного типа работает? Хелпер придется выделять в любом случае из кучи? Наличие хелпера добавляет еще один уровень косвенности?
Ну можно сделать условно char buff[sizeof(T)]; new (buff) T();
Тип хелпера T же у нас абстрактный, как от него sizeof взять, чтобы любой хелпер в std::function разместить?
Конструкторы и операторы присваивания у std::function шаблонные
Ну а буфер char buff[sizeof(T)] ведь не в шаблонном классе обязан находиться? Может тогда sizeof(T) зависить от параметра шаблона?
В классе выделяешь поле с буффером определенным. Сравниваешь размер Т если он меньше кладешь туда, если нет то в куче. Можешь про SOO почитать
Обсуждают сегодня