2013-03-29 26 views
5

Próbuję przeprowadzić sekcję tego pliku sieci web ++ ++ https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppjaki jest cel std :: set <VALUE, std :: owner_less <VALUE>>?

W linii 126 znajduje się typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;. Zastanawiam się, dlaczego nie jest to tylko typedef std::set<connection_hdl> con_list;.

Przeczytałem How does the Comma Operator work i http://en.cppreference.com/w/cpp/memory/owner_less, ale nie jestem pewien, jaki jest cel.

Co właściwie jest przechowywane w std::set? Co właściwie robi std::owner_less? Jaki jest cel stworzenia pojemnika z tą strukturą zamiast przechowywania samych siebie?

+2

Nie ma to nic wspólnego z operatorem przecinków, a strona, do której prowadzi link do 'std :: owner_less', powinna bezpośrednio odpowiedzieć na twoje pytanie. – ildjarn

+1

'std :: set' przyjmuje wiele parametrów szablonu, ale tylko pierwsza jest jawnie wymagana; reszta ma domyślne typy, jeśli ich nie definiujesz. Drugi parametr jest funkcją binarną używaną do sortowania. –

+2

BTW, 'connection_hdl' to' std :: weak_ptr '. –

Odpowiedz

8

Nie ma to nic wspólnego z operatorem przecinka. A set<T> wymaga, aby T był mniejszy niż porównywalny, to znaczy operator < powinien być zdefiniowany dla T. Powodem tego jest to, że zestaw zachowuje swoje elementy w uporządkowany sposób (za pomocą jednego rodzaju drzewa lub innego). Możesz dostarczyć zestaw z drugim argumentem szablonu - funktor, który porównuje dwa elementy, aby zestaw mógł użyć tego porównania. std::owner_less jest szablonem predykatów, który działa na współdzielonych i słabych wskaźnikach i wykonuje uporządkowanie oparte na właścicielu (w przeciwieństwie do wartości).

Powiązane problemy