2014-06-11 14 views
5

Chciałbym użyć observer_ptr w moim projekcie, ale paper definiuje tylko interfejs, a nie pełną implementację. Czy istnieje teraz implementacja open source, czy też muszę to zrobić samodzielnie?Czy jest teraz implementacja dla obserwatora_ptr?

+0

Z abstrakcji nie widzę dużej różnicy w stosunku do 'weak_ptr'. Edycja: W gazecie nawet nie wspomniano o 'weak_ptrs' ... WTH ?? – RedX

+5

@RedX: weak_ptr potrzebuje przydzielonego stanu współdzielonego i nie będzie użyteczny, chyba że obiekt jest własnością niektórych shared_ptr. Tak więc semantyka i użycie wydaje się zupełnie inne. – lisyarus

+1

@RedX, 'weak_ptr' nie może być użyte na' unique_ptr'. – UniversE

Odpowiedz

15

Możesz utworzyć tak zwane observer_ptr, tworząc unique_ptr z delerem NOP.

template<typename T> 
struct nop_deleter 
{ 
    void operator()(T*) const {} 
}; 

template<typename T> 
using observer_ptr = unique_ptr<T, nop_deleter>; 

to nadal będzie miało zachowanie unique_ptr „s, co oznacza, że ​​znajduje się poruszać tylko, gdy tylko chcesz observer_ptr być copyable. Co prowadzi nas do prostszej implementacji:

template<typename T> 
using observer_ptr = T*; 

To robi wszystko, co chcesz. Możesz go nazwać observer_ptr<int> zamiast int *, ponieważ ten drugi jest oczywiście zły. Jest kopiowalny i nie robi nic po zniszczeniu.


mam być żartobliwy odpowiedź powyżej, ale miejmy nadzieję, że będzie ona wykazać, że observer_ptr nie ma wiele użytkowego inne niż posiadające inną nazwę niż surowiec typu wskaźnika. There's nic złego w korzystaniu z nieprzetworzonego wskaźnika nie będącego właścicielem.

Można argumentować, że observer_ptr przekazuje zamiar, ale ten argument jest poprawny tylko wtedy, gdy baza kodu zawiera instancje surowych wskaźników zarządzających zasobami. Wyeliminuj te, a następnie surowy wskaźnik będzie automatycznie oznaczać observer_ptr ... bez wymyślnej nazwy.


Jeśli bezwzględnie musisz mieć wymyślną nazwę i/lub inny typ, samodzielne wykonanie powinno być łatwe.

+4

Przypuszczam, że jedną z wymaganych funkcji observer_ptr jest interfejs kompatybilny z innymi standardowymi inteligentnymi wskaźnikami (mając metody takie jak reset, zamiana, get, prawdopodobnie wydanie) – lisyarus

+1

Dziękuję bardzo :) Twoja implementacja jest elegancka, a twój pomysł jest niesamowity ! Nie sądzę, żeby używanie surowych poinerów było złe. Unikaj i używaj ich tylko wtedy, gdy jest to konieczne, ponieważ wygląda to chaos, gdy mieszają się "unique_ptr xxx" i "xxx * xxx". Z drugiej strony jestem zapominalski i nie chcę sprawdzać każdego surowego wskaźnika, czy powinien on zostać bezpiecznie usunięty/uwolniony po kilku miesiącach, a potem prawie całkowicie zapomnę segmentów kodu: D – UniversE

+2

@lisyarus Tak, interfejs jest zgodny z innymi inteligentnymi wskaźnikami i być może są okazje, kiedy tego potrzebujesz. Ale nie spotkałem się jeszcze z koniecznością generowania operacji na inteligentnym typie wskaźnika bez znajomości semantyki własności podczas gry. Ale jestem pewien, że wymyślony przykład można ugotować tam, gdzie byłoby to przydatne. W rzeczywistości narzędzie byłoby raczej ograniczone. – Praetorian

7

Tak: observer-ptr dla C++ 98 i dla GitHub.

+0

Martin Moene, dziękuję :) To bardzo miła praca. – UniversE

+0

Dziękuję, to właśnie powinna być akceptowana odpowiedź, a nie "przysłuchiwana" odpowiedź "na chybił trafił". – Elizafox

Powiązane problemy