2013-03-29 2 views
5

이 websocket ++ 예제를 해부하려합니다. https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppstd :: set <VALUE, std :: owner_less <VALUE>>의 목적은 무엇입니까?

라인 126에는 typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;이 있습니다. 왜 그것이 단지 typedef std::set<connection_hdl> con_list;이 아닌지 궁금합니다.

나는 How does the Comma Operator workhttp://en.cppreference.com/w/cpp/memory/owner_less을 읽었지만 목적이 무엇인지 잘 모르겠습니다.

실제로는 std::set에 저장되는 것은 무엇입니까? std::owner_less은 실제로 무엇을합니까? connection_hdl 자체를 저장하는 대신이 구조로 컨테이너를 만드는 목적은 무엇입니까?

+2

이것은 쉼표 연산자와 아무 관련이 없으며'std :: owner_less'에 링크 된 페이지가 직접 질문에 대답해야합니다. – ildjarn

+1

'std :: set'은 여러 개의 템플릿 매개 변수를 취하지 만 첫 번째 매개 변수 만 명시 적으로 필요합니다. 나머지는 정의하지 않으면 기본 유형을 갖습니다. 두 번째 매개 변수는 정렬에 사용되는 이진 함수입니다. –

+2

BTW,'connection_hdl'은'std :: weak_ptr '입니다. –

답변

8

이것은 쉼표 연산자와는 아무런 관련이 없습니다. set<T>의 경우 T이 비교 대상보다 작아야합니다. 즉 operator <T으로 정의해야합니다. 그 이유는 세트가 그 요소를 (트리 또는 다른 트리를 통해) 정렬 된 방식으로 유지하기 때문입니다. 두 번째 템플리트 인수를 사용하여 세트를 제공 할 수 있습니다.이 인수는 세트가 해당 비교를 사용할 수 있도록 두 요소를 비교합니다. std::owner_less은 공유 및 약 포인터를 처리하고 소유자 기반 (값 기반이 아닌) 순서를 수행하는 조건부 템플릿입니다.