이 질문은 이전에 물어 보았지만 꽤 경험있는 코더 임에도 불구하고 나는 대답을 이해하지 못하고 이러한 이전 질문에 응답 할 방법이 없다고 생각합니다. 설명. "답장"링크 또는 기타 사항이 없습니다. 게다가, 그 질문은 꽤 오래되었습니다. 그래서, 나는 새 질문을하고있다.C++에서 std :: function signature에 오버로드하는 방법
나는 + = 연산자를 오버로드하는 클래스가 있습니다. 나는 1 과부하가 노출 된 함수 포인터를 먹고 싶어하고, 다른 하나는 표준 : 기능을 위해 :
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
사용법 : 컴파일러가 결정할 수 없기 때문에
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
불행하게도, 코드가 컴파일되지 않습니다 두 번째 오버로드는 처음 + = 호출에 적합하지 않습니다.
내 연산자 + = 멤버 함수를 정의하여이 문제를 어떻게 해결합니까? 연산자를 사용하는 방법을 변경하고 싶지 않습니다 (예 : 명시 적 캐스트 사용). 나는 그들이 위에서 보여준대로 일하기를 바랍니다.
void operator+=(function<void()> handler);
을 그러나 다시, 나는 기능 <> 템플릿의 서명을 기반으로 과부하 수 없습니다
또한,뿐만 아니라 다음과 같은 과부하를 준비해야 될 것이다.
자세한 예제는이 스레드를 참조하십시오 : Isn't the template argument (the signature) of std::function part of its type? (나는 스레드에서 언급 된 다양한 솔루션을 구현했는데, 그 중 것도를 컴파일하지 않을 것이다) 나는의 번호에 여러 해 동안 봤는데 프로그래밍
언어,하지만 내 C + + 기술은 약간 녹슬고있다.
** 큰 질문은 : __what 주어진 함수 포인터 또는'std :: function' 오브젝트를 오버로드 연산자'='?에서 수행하려고합니까? __ – zaufi
@zaufi : 어떻게 볼 수 없습니까? 그건 맞지만 괜찮아. 나는 이것을 이벤트 핸들러 함수의 std :: vector에 추가 할 것이다. 나는 기본적으로 C++에서 .NET 이벤트를 구현하고있다. 왜냐하면 그 힘은 이벤트와 속성이 - 마치 클로저와 같이 - 현대 프로그래밍 언어에 절대적으로 필수적인 기능이라는 사실을 머리로 감싸지 않았기 때문입니다. –
그렇다면,'std :: vector'를 exchly 하나 ('void()'제안) 서명으로'std :: function'으로 인스턴스화해야합니다 ... 맞습니까? – zaufi