Czy wiele klas proxy może stanowić bitvector odporny na STL?
Jegodobrze znane żestd::vector<bool>
nie spełnia wymagań kontenera normy, głównie dlatego, że zapakowana reprezentacja zapobiegaT* x = &v[i]
od zwracania wskaźnika do bool.
Moje pytanie brzmi:można to naprawić / złagodzić, gdy parametr reference_proxy przeładuje adresoperator&
zwracać wskaźnik_proxy?
Wskaźnik-proxy może zawierać takie same dane jak referencyjny_proxy w większości implementacji, a mianowicie wskaźnik do spakowanych danych i maska izolująca konkretny bit wewnątrz bloku wskazywanego. Kierunek proxy_proxy da wtedy referencyjny_proxy. Zasadniczo oba serwery proxy są „grubymi” wskaźnikami, które jednak nadal są dość lekkie w porównaniu z kontenerowymi serwerami proxy opartymi na dyskach.
ZamiastT* x = &v[0]
wtedy można to zrobićauto x = &v[0]
, I użyćx
lubićif(*x)
bez problemów. Chciałbym też móc pisaćfor(auto b: v) { /* ... */ }
pytania: czy takie podejście z wieloma serwerami proxy działa z algorytmami STL? Albo czy niektóre algorytmy naprawdę polegają na wymaganiu, które to wymagax
musi być prawdziwybool*
? Czy też jest wymaganych zbyt wiele kolejnych konwersji zdefiniowanych przez użytkownika, które uniemożliwiają to? Chciałbym poznać każdą z takich przeszkód, zanim spróbuję w pełni wypełnić powyższy szkic implementacji.
AKTUALIZACJA (w oparciu o odpowiedź @HowardHinnant i tostarożytna dyskusja na comp.std.c ++)
Możesz przejść długą drogę, aby niemal naśladować wbudowane typy: dla każdego typu T para serwerów proxy (np. Reference_proxy i iterator_proxy) może być wzajemnie spójna w tym sensie, że reference_proxy :: operator & () i iterator_proxy :: operator * () są nawzajem odwrotne.
Jednak w pewnym momencie należy odwzorować obiekty proxy z powrotem, aby zachowywały się jak T * lub T &. W przypadku serwerów proxy iteratora można przeciążać operatora -> () i uzyskiwać dostęp do interfejsu szablonu T bez ponownego wdrażania całej funkcjonalności. Jednak w przypadku serwerów proxy referencyjnych konieczne byłoby przeciążenie operatora. (), Co nie jest dozwolone w obecnym C ++ (chociażSebastian Redl przedstawił taką propozycję na BoostCon 2013). Możesz dokonać szczegółowego obejścia, takiego jak element .get () wewnątrz referencyjnego serwera proxy, lub zaimplementować cały interfejs T wewnątrz referencji (tak jest w przypadku wektora :: bit_reference), ale spowoduje to utratę wbudowanej składni lub wprowadź konwersje zdefiniowane przez użytkownika, które nie mają wbudowanej semantyki dla konwersji typów (możesz mieć najwyżej jedną konwersję zdefiniowaną przez użytkownika na argument).