Könnten mehrere Proxy-Klassen einen STL-sicheren Bitvector bilden?

Es istsehr bekannt Dasstd::vector<bool> entspricht nicht den Containeranforderungen des Standards, hauptsächlich weil die verpackte Darstellung dies verhindertT* x = &v[i] vom Zurückgeben eines Zeigers auf einen Bool.

Meine Frage ist:kann dies behoben / gemildert werden, wenn der reference_proxy die address-of überlastetoperator& kann man einen pointer_proxy zurückgeben?

Der Zeiger-Proxy könnte in den meisten Implementierungen dieselben Daten wie der Referenz-Proxy enthalten, nämlich einen Zeiger auf die gepackten Daten und eine Maske zum Isolieren des bestimmten Bits innerhalb des Blocks, auf den gezeigt wird. Die Indirektion des Zeiger-Proxy würde dann den Referenz-Proxy ergeben. Im Wesentlichen handelt es sich bei beiden Proxys um "fette" Zeiger, die jedoch im Vergleich zu festplattenbasierten Proxy-Containern immer noch relativ leicht sind.

AnstattT* x = &v[0] man könnte es dann tunauto x = &v[0]und verwendenx mögenif(*x) ohne Probleme. Ich würde auch gerne schreiben könnenfor(auto b: v) { /* ... */ }

Fragen: würde ein solcher Multi-Proxy-Ansatz mit den STL-Algorithmen funktionieren? Oder hängen einige Algorithmen wirklich von der Anforderung ab, dassx muss ein echter seinbool*? Oder sind zu viele aufeinanderfolgende benutzerdefinierte Konvertierungen erforderlich, die verhindern, dass dies funktioniert? Ich möchte solche Hindernisse kennen, bevor ich versuche, die obige Implementierungsskizze vollständig zu vervollständigen.

AKTUALISIEREN (basierend auf der Antwort von @HowardHinnant und dieseralte Diskussion auf comp.std.c ++)

Sie können einen weiten Weg zurücklegen, um die eingebauten Typen fast nachzuahmen: Für jeden Typ T kann ein Paar von Proxys (z. B. reference_proxy und iterator_proxy) in dem Sinne, dass reference_proxy :: operator & () und iterator_proxy :: operator * miteinander konsistent gemacht werden. () sind gegenseitig umgekehrt.

Irgendwann muss man die Proxy-Objekte jedoch zurückmappen, um sich wie T * oder T & zu verhalten. Für Iterator-Proxys kann man operator -> () überladen und auf die Benutzeroberfläche der Vorlage T zugreifen, ohne die gesamte Funktionalität neu zu implementieren. Für Referenz-Proxys müssten Sie jedoch operator. () Überladen, was in aktuellem C ++ nicht zulässig ist (obwohlSebastian Redl präsentierte einen solchen Vorschlag auf der BoostCon 2013). Sie können eine ausführliche Problemumgehung wie ein .get () -Mitglied im Referenz-Proxy ausführen oder die gesamte Schnittstelle von T in der Referenz implementieren (dies wird für vector :: bit_reference durchgeführt), wobei jedoch die integrierte Syntax verloren geht oder benutzerdefinierte Konvertierungen einführen, die keine integrierte Semantik für Typkonvertierungen haben (Sie können höchstens eine benutzerdefinierte Konvertierung pro Argument durchführen).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage