Здравствуйте, so5team, Вы писали:
S>Вы не ответили на вопрос о том, каким боком и зачем бы приплетен паттерн Visitor.
S> тому человеку, возможно (и скорее всего) нужно было в качестве callback-ов использовать чисто сишные функции. А это может потребоваться по разным причинам, начиная от использования легаси-кода и заканчивая интеграцией C++ного кода и кода на каком-нибудь Lua или Python (из которых наружу торчат C-шные интерфейсы).
Почитайте про Visitor, подумайте.
S>>> кто контролирует ее время жизни. Отвечая на этот вопрос вы и придете к необходимости возвращать (умный) указатель на реализацию интерфейса.
Тё>>unsubscribe() мешает благородному дону удалить instance?
S>У меня пока проблема в том, чтобы разобраться с предложенным вами вариантом. Т.е. понять, что это за вариант вообще.
S>Пока что вырисовывается приблизительно такая картина:
| | Скрытый текст |
| | S>S>template<typename T>
S>class SubscriptionStorage {
S>public:
S> struct Unsubscription {
S> virtual ~Unsubscription() = default;
S> virtual void unsubscribe() noexcept = 0;
S> };
S> [[nodiscard]]
S> Unsubscription * subscribe(T && value);
S> ...
S>private:
S> struct Link {
S> virtual ~Link() = default;
S> Link * prev_;
S> Link * next_;
S> };
S> struct OneSubscription : public Link, public Unsubscription {
S> T payload_;
S> ...
S> void unsubscribe() override {
S> ... // Вычеркивание из списка.
S> delete this; // Уничтожение узла.
S> }
S> }
S> Link sentinel_;
S>};
S>template<typename T>
S>Unsubscription * SubscriptionStorage::subscribe(T && value) {
S> return new OneSubscription(std::move(value), ...);
S>}
S>
|
| | |
Примерно так, только названия поменять:
Unsubscription => Subscription (подписка)
SubscriptionStorage => ObservableImpl
Link => Node
OneSubscription => SubscriptionNode
sentinel иницировать в конструкторе:
sentinel.next = sentinel.prev = sentinel.
Можно ещё поиграться с пре-инициализацией кэша SubscriptionNode как цикличного списка, и чтобы ObservableImpl брал Node оттуда в свой список, а при unsubscribe возвращал обратно. Будет тебе тогда cache locality и избежание динамического выделения памяти:
SubscriptionNode[2048] nodeCache;
S>>>Но для этого в C++ немного понимать нужно.
Тё>>Слушайте, меня конкретно уже разрывает на вашу узколобость в сочетании наскоками на моё знание C++. Вот такие представители профессии и создают негативный стереотип о C++- ках.
S>S>-- Этот ваш C++ говно и для разработки реал-тайма не применяется!
S>-- А ты хоть C++ знаешь?
S>-- Да!
S>-- Что такое виртуальный деструктор?
S>-- Какой ты токсичный! Из-за таких как вы и C++ сообщество считается токсичным!
Ну вот для вас виртуальный деструктор- верх сложности? О чём я и говорил: слабость в алгоритмах и религиозная вера в C++.
Тё>>Это не относится к действительно прокачанным программистам (как Зудин), которые в силу обстоятельств применяют C++ как инструмент.
S>Мне как-то фиолетово, насколько прокачанным вы считаете меня, но таки применяю C++ как инструмент. Т.к. в области интересных для меня задач до недавнего времени широко использовались только C и C++, где-то еще была Ada. Сейчас вот Rust подвезли. Но до настоящего мейнстрима Rust-у еще нужно добираться лет 5.
Я вообще много чем занимался, и нигде из компаний, не являлся C++ рационально обоснованным инструментом. Только исторически или в силу религии.