Я пытаюсь реализовать механизм сигнального слота в чистом C++ (14), и у меня есть работающий connect/disconnect/emit, где слоты могут быть любыми вызываемыми, кроме функций-членов. Я использовал простую реализацию, используя std :: function типа, определяемого аргументами шаблона класса сигнала. Сравнение, чтобы найти правильную функцию для разъединения, выполняется с помощью указателя функции std :: function, доступного через std :: function :: target.Как Qt идентифицирует указатели на функции функции?
И вот где я застрял: это не будет работать для функций-членов. Я храню их как указатель на объект и std :: функцию, созданную из lambda, которая привязала параметр указателя первого класса. Мне нужен способ отключить одну функцию-член только с указателем объекта (и типом) и указателем на функцию-член.
Я знаю, что Qt делает именно это, но я боюсь, что он использует код, созданный moc, для этого. Я попытался взглянуть на исходный код QObject, но он быстро становится грязным (и начинает передавать указатели на элементы как void ** или так кажется). Поэтому возникает вопрос: как я могу имитировать поведение Qt без moc? Примечание. Мне не нужна совершенная идентификация; если аргументы tja connect и disconnect call идентичны, это должно работать, но если (в случае виртуального слота) для идентификации функции используется другой класс в иерархии, все ставки могут быть отключены.
Я думал о создании функции фиктивного шаблона, специализированной на указателе на член (если это возможно) и используя свой адрес в качестве идентификатора (я попытаюсь написать код того, что я имею в виду здесь), но Я знаю, по крайней мере, MSVC, который разрушает это поведение, совместимое со стандартами, с его опцией/ICF ...
PS: Я также узнал, что Boost.Signals (2) работает вокруг этой проблемы, возвращая какой-то указатель на соединение, которое затем может быть легко использовано для извлечения и удаления из сигнала. Я хотел бы предотвратить необходимость отслеживать этот ключ со стороны пользователя i.
Похоже, что это также обременяет пользователя хранением объекта «connection», через который можно отключить соединение: https://developer.gnome.org/libsigc++-tutorial/stable/ch02s04.html. Это суб-идеал для того, что я имею в виду, а не то, что делает Qt. Я хотел бы посмотреть, смогу ли я реализовать Qt-подобную систему и посмотреть, стоит ли это. – rubenvb
Это на самом деле не отвечает на вопрос. –