T
유형의 요소에 대한 포인터를 보유 할 수있는 템플릿 기반 클래스를 만든 다음 함수를 수행해야합니다. 함수는 다른 장소에서 올 것입니다. 그래서 컨테이너를 저장해야하므로 나중에 호출 할 수 있습니다. 나는 속도를 제공하고 해시 테이블로 구현되기 때문에 중복을 제한하기 때문에 std::unordered_set
을 사용하기로 결정했습니다. 나는 전체 클래스를 작성했지만, T
포인터를 취하여 void
을 반환하는 내 std::function
에 대해 정의 된 해시 함수가 없기 때문에 컴파일되지 않습니다. struct hash<std::function<void(MyCustomType*)>>
(그리고 ()
연산자도 오버로드)을 사용하여 각 유형에 대해 지정하기는 쉽지만 실제로 함수를 해시하는 방법은 무엇입니까? 여기 std :: hash <std :: function> 정의
template <typename T>
class Master {
private:
std::unordered_set<std::function<void(T*)>> functions;
protected:
registerFunction(std::function<void(T*)> function) {
this->functions.insert(function);
}
unregisterFunction(std::function<void(T*)> function) {
this->functions.erase(function);
}
};
내가 완전히 std::unordered_set
를 사용하여 결합 아니지만, 내가 필요한 것 모든 것을 제공하는 것 이 조각 (및 나머지 코드)이 잘 작동하도록하십시오.
내가 잘못 생각하고 있습니까? std::function
을 해시하는 것은 완전히 불가능합니까?
당신은 op ==를 정의 할 필요가 있습니다. 이것은 거의 불가능합니다. – PlasmaHH
당신이 직면하는 문제는'std :: function'이 어떤 호환 형의 어떤 펑터도 가질 수 있다는 것입니다. 그게 전부 요점 타자를 치십시오. 포함 된 내용에 액세스 할 수 없으면 해시하거나 값을 비교할 수 없습니다. 그리고 비록'std :: function'이 여러분에게 접근 권한을 주길 원한다고해도 기본적으로 할 수 없습니다 : 타입이 무엇이든 될 수 있기 때문에 아무 것도하지 않는 함수를 작성할 수 없습니다. –