Re[26]: Исповедь C++ника
От: Тёмчик Австралия жж
Дата: 27.12.20 12:53
Оценка: -1 :)
Здравствуйте, 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++ рационально обоснованным инструментом. Только исторически или в силу религии.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.