순수 C++ (14)에서 신호 슬롯 메커니즘을 구현하려고하는데 슬롯은 멤버 함수를 제외하고는 호출 할 수있는 연결/연결 끊기/방출을 사용합니다. 나는 신호 클래스의 템플릿 인자에 의해 결정된 타입의 std :: function을 사용하여 간단한 구현을 사용했다. 올바른 함수 연결을 찾으려면 std :: function :: target을 통해 얻을 수있는 std :: function의 기본 함수 포인터를 사용하십시오.Qt는 멤버 함수 포인터를 어떻게 식별합니까?
그게 내가 꼼짝 못하는 부분입니다. 이것은 회원 기능을 위해 작동하지 않습니다. 나는 그것들을 객체 포인터와 std :: function으로 저장하고 있는데, 이것은 랭다 (first class pointer parameter)를 묶은 람다 (lambda)로부터 생성 된 함수이다. 개체 포인터 (및 형식) 및 멤버 함수에 대한 포인터 만 사용하여 단일 멤버 함수를 연결 해제 할 수있는 방법이 필요합니다.
Qt가 정확하게 이것을 알고 있지만, moc에서 생성 한 코드에 의존하므로 두려워합니다. 나는 QObject 소스 코드를 살펴 보았지만 신속하게 진흙 투성이가되었다. (멤버에게는 void **로 포인터가 전달되기 시작한다. 그래서 질문은 : moc없이 Qt의 행동을 어떻게 모방 할 수 있습니까? 참고 완벽한 식별이 필요하지 않습니다. tja 연결 및 연결 끊기 인수가 동일하면이 작업은 가능하지만 가상 슬롯의 경우 계층 구조의 다른 클래스를 사용하여 함수를 식별하는 경우 모든 베팅이 해제 될 수 있습니다.
나는 (심지어 가능하다면) 멤버에 대한 포인터를 전문으로하는 더미 템플릿 함수를 작성하고 그 주소를 ID로 사용한다고 생각했다. (나는 여기서 의미하는 코드를 작성하려고한다.) 그러나 나는 최소한/MSF 옵션으로이 표준을 준수하는 동작을 파괴하는 MSVC를 알고있다 ...
추신 : Boost.Signals (2)는이 문제를 해결하기 위해 일종의 포인터를 연결이 저장된 다음 신호에서 쉽게 검색하고 제거 할 수 있습니다. 가능한 한 사용자 측에서이 키를 추적 할 필요가 없도록하고 싶습니다.
https://developer.gnome.org/libsigc++-tutorial/stable/ch02s04.html에서 연결을 끊을 수있는 연결 개체를 저장하는 데 사용자가 부담을 느끼는 것처럼 보입니다. 이것은 Qt가하는 것이 아니라 마음에있는 것에 이상적입니다. Qt와 같은 시스템을 구현할 수 있는지, 그리고 그 시스템이 가치가 있는지 확인하고 싶습니다. – rubenvb
이것은 실제로 질문에 대답하지 않습니다. –