2013-12-19 2 views
4

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을 해시하는 것은 완전히 불가능합니까?

+0

당신은 op ==를 정의 할 필요가 있습니다. 이것은 거의 불가능합니다. – PlasmaHH

+0

당신이 직면하는 문제는'std :: function'이 어떤 호환 형의 어떤 펑터도 가질 수 있다는 것입니다. 그게 전부 요점 타자를 치십시오. 포함 된 내용에 액세스 할 수 없으면 해시하거나 값을 비교할 수 없습니다. 그리고 비록'std :: function'이 여러분에게 접근 권한을 주길 원한다고해도 기본적으로 할 수 없습니다 : 타입이 무엇이든 될 수 있기 때문에 아무 것도하지 않는 함수를 작성할 수 없습니다. –

답변

3

세트는 대부분 데이터가 들어 있는지 확인할 것입니다.

그래서 여기에 하나의 요점을 사용하는 것이 보이지 않습니다 ... 당신은 당신의 기능을 가지게 될 것이고 당신은 그것들을 세트에 보관할 것입니다. 너는 그저 반복 할 뿐이야?

질문에 대해 집합의 요소에는 해시를 생성하는 방법과 operator==()이 있어야합니다. 두 번째는 std::function에 제공되지 않으므로 기능이 실제로 설정되어 있는지 확인할 수 없습니다.

그래서 함수에서 해시를 생성하는 방법을 찾더라도 막히게 될 것입니다 ... 그리고 hash 요구 사항을 충족시키는 방법을 알지 못합니다.

단순히 std::vector을 사용하지 않는 이유는 무엇입니까?

+0

'std :: vector '로 전환하려고 생각했는데, 이제 이것을 들으면서 아마 할 수있을 것입니다. 나는 내가 바라는 유일성을 얻지 못할 것이다. 'registerFunction()'메소드에서 인덱스를 반환하기 만하면된다. unregisterFunction()에서 사용한다. 감사! –

+0

인덱스를 반환하면 벡터에서 요소를 지울 때 인덱스가 무효화 될 수 있으므로 인덱스가 올바르게 반환되지 않습니다. 요소가 제거 될 때 std :: list로 전환하여 반복자를 반환하거나 더미 함수를 벡터에 저장할 수 있습니다. – Nevin

+0

@AndrewLarsson 등록하는 메카니즘에 대해서도 이중 호출을 방지하는 방법을 알지 못합니다. unity 컨트롤을 정말로 원한다면'std :: unordered_map > '함수를 사용하여 함수 이름을 지정하지 않을까요? 코드 사용자는 두 가지 다른 이름으로 기능을 등록해야하며 이중 호출 지점이 필요합니다. 이름을 함수에 자동으로 연결하는 악명 높은 매크로를 사용할 수도 있습니다. – Johan