Size: a a a

IT KPI C/C++ ХВ (не UB)

2021 April 19

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
через полчаса уже другой
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
та почему
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
в анриале делегаты без них пашут
там своя система с рефлексией
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
ну там у них свои архитекторы, я хз если честно как там всё устроено
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
спойлер: очень запарно)
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
на то он и анриал
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
кек
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
class Object {
public:
   virtual ~Object() = default;
};

class Derived1 : public Object {
public:
   void f(void *a, void *b, void *c) {
       std::cout << "Hello World 1!" << std::endl;
   }
};

class Derived2 : public Object {
public:
   void f(void *a, void *b, void *c) {
       std::cout << "Hello World 2!" << std::endl;
   }
};

class FDelegateSignature {
   TYPE *m_object = nullptr;
   void (TYPE::*m_delegate)(void *, void *, void *) = nullptr;

public:
   void Bind(TYPE *object, void (TYPE::*delegate)(void *, void *, void *)) {
       m_object = object;
       m_delegate = delegate;
   }
   void UnBind() {
       m_object = nullptr;
       m_delegate = nullptr;
   }
   void Execute(void *a, void *b, void *c) {
       return std::invoke(m_delegate, m_object, a, b, c);
   }
};

ну допустим есть вот такой огрызок кода. очевидно, что тут надо что-то думать с типом класса, который прописан в делегате.
если делать через шаблоны и указывать одного из DerivedN, то второй не сможет подписаться на этот ивент, даже при том, что у него такая же сигнатура.
от того и спрашиваю, что тут уб, а что нет))
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
Естественным расширением этого класса будет внедрение контейнера с указателями на подписчиков и указателями на их функции, но это уже совсем другая история...
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
поднимаю чатик в списке)
вопрос остался если шо
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
ну я б делал так
делаешь базовый клас колбек
он просто обьявляет интерфейс, там есть функция колл
от него наследуется шаблонный класс
он шаблонный по двум типам
первый это собственно обьект, а второй метод этого объекта
и этот класс внутри хранит два этих указателя
потом нужно ещё два класса контейнер подписчиков и интерфейс для него
этот контейнер будет шаблонным но уже по типу ивента, он будет кастить ивент в нужный тип и передавать в функцию интерфейса колбека
в итоге получится класс что хранит мапу обьект ивента к списку подписчиков
при подписке создаётся шаблонный список подписчиков(он запоминает тип ивента), в него ложится колбек(он запоминает тип конкретного класса ну и тип функции что хочет получить сообщение)
как то так(походу никто не поймет что я тут написал)
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Кучеряво однако
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
зато кастит автоматически
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
K P A C U B O
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
Я +- понял, но больше пойму, когда начну реализовывать
источник

RN

Ruslan Neshta in IT KPI C/C++ ХВ (не UB)
там только один момент вроде был с тем что в базовом будет чисто виртуальная функция, а дочерний шаблонный будеи эту виртуальную реализовывать в виде вызова шаблонной функции (а внутри шаблонной уже каст собственно)
источник

AW

Alexander Wizaral in IT KPI C/C++ ХВ (не UB)
ah shit
источник

s

sust in IT KPI C/C++ ХВ (не UB)
Привет. Подскажите, пожалуйста, почему это работает?
0[arr] == arr[0] // 1
источник

G

GNU/Vsevolod in IT KPI C/C++ ХВ (не UB)
arr[i] == i[arr] == *(arr + i)
источник

J

Jmik in IT KPI C/C++ ХВ (не UB)
потому что x[y] разворачивается в
*(х+у)
источник