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).

questionAnswers(2)

yourAnswerToTheQuestion