Простая система событий на С++11 (комментарии)
Это сообщение сгенерировано автоматически.
#define DECLARE_EVENT_TRAIT(eventTrait, ...)
m$ $тудия вроде такого не умеет.
Sbtrn. Devil
> m$ $тудия вроде такого не умеет.
Чего именно ? Если вы про __VA_ARGS__ в макросах - то умеет еще с бородатых времен.
Ошибок и опечаток (чисто по тексту) довольно много. А так - ничего, прикольная и интересная статейка, было приятно почитать. 0r@ngE, спасибо что нашёл время написать!
0r@ngE
Вижу такие недостатки:
typedef std::unordered_map<std::size_t, std::shared_ptr<BasicEvent>> EventsMap;
Не лучше ли в данном случае использовать std::unique_ptr?
std::hash<std::string> hasher; result = hasher(traitName); // TODO: replace this with something platform-independent
Вопрос к комментарию, разве std::hash и так платформонезависим?
Статья понравилась, спасибо.
Ухх, не ожидал коментариев, спасибо всем. Сейчас постараюсь ответить.
slava_mib
> Ошибок и опечаток (чисто по тексту) довольно много.
Виноват. Пишу в слепую ибо нет под рукой клавиатуры с кирилицей. Вроде вычитывал текст. Пройдусь еще разок, спасибо!
Wraith
> Вижу такие недостатки:
> нельзя подписаться на определенный объект;
> тянет за собой жесть в виде половины stl;
> поиск по именам на каждый raise;
> Added:
> чем больше в системе зарегано разных событий, тем тормознее будет каждый
> raiseEvent, даже если на этот конкретный эвент никто не подписан.
По пунктам:
1) Да, действительно нельзя. Я такое и не закладывал. Но вполне можно создавать локальные EventSystem'ы для объекта, скажем, для общения чисто его компонентов. Тогда понадобятся функции типа local_subscribe и local_raise.
2) Ну, в этом и был поинт статьи. При желании можно заменить на свою имплементацию делегатов и контейнеров. Смысл от этого не поменяется.
3) Нет. Внутри get_event_trait_hash - static результат. Т.е. вычислен он будет лишь раз и затем будет отдан каждый вызов уже готовый. Если юзается GCC можно еще немного оптимизировать заюзав __builtin_expect
4) Ну, вроде unordered_map довольно быстрый, лично у меня проблем с производительностью пока не было. Но всегда можно оптимизировать это место если упретесь именно сюда.
Gorunuch
> Не лучше ли в данном случае использовать std::unique_ptr?
Лучше, вы абсолютно правы. Спасибо.
Gorunuch
> Вопрос к комментарию, разве std::hash и так платформонезависим?
Я бы не полагался на его одинаковое поведение на разных платформах. Потому и поставил камент - замените на любой подходящий вам алгоритм. FNV например.
0r@ngE
За что Observer обидел ? Предлагаю дописать вариант с ним
Wraith
> тянет за собой жесть в виде половины stl;
+
PS: Кармак приди, порядок наведи.
programina
> +
> PS: Кармак приди, порядок наведи.
И снова мне не понятна суть притензии. Код минимален, заменить STL на собственные велосипеды не сложно.
0r@ngE
> И снова мне не понятна суть притензии
STL
> Код минимален
template <std::size_t N> struct is_placeholder<ev::detail::placeholders_generator<N>> : std::integral_constant<std::size_t, N + 1>{};
134 символа, не считая отступа, - это не код, это какая то "Война и мир" Льва Толстого...
0r@ngE
> заменить STL на собственные велосипеды не сложно
Вам не сложно, а я такое даже прочитать не могу.
повезло есть variadic templates
вот как это можно сделать по классике
http://codepaste.net/npwwi1
programina
> 134 символа, не считая отступа, - это не код, это какая то "Война и мир" Льва Толстого...
> Вам не сложно, а я такое даже прочитать не могу.
Без обид, но может вам просто рано С++ ? ;)
IROV..
> вот как это можно сделать по классике
Ну, поэтому я и хотел обратить внимание на то, как в наши дни это можно красиво сократить используя последнии версии стандарта С++.
Но лично я не сторонник Observer'а изза множественного наследования.
0r@ngE
> у, поэтому я и хотел обратить внимание на то, как в наши дни это можно красиво
> сократить используя последнии версии стандарта С++.
> Но лично я не сторонник Observer'а изза множественного наследования
Лично я не сторонник новых стандартов - пусть уж лучше множественного наследования :)
Тема в архиве.