Ist das ein sicherer Workaround? Ich möchte vector bool verwenden, muss aber einen Zeiger auf alten Code übergeben, der C-array erwartet.
%Vor%Bearbeiten: Danke für die Vorschläge anderer Lösungen, aber ich möchte wirklich eine definitive Antwort auf meine obige Lösung. Danke.
Ich bin mir nicht sicher über std::basic_string<bool>
, weil dadurch std::char_traits<bool>
instanziiert wird und ich nicht sicher bin, ob der Standard definiert werden muss oder ob die primäre Vorlage char_traits
mit undefiniert bleiben kann und nur explizit Spezialisierungen wie char_traits<char>
sind definiert. Sie dürfen keine eigene Spezialisierung von char_traits<bool>
angeben, da Sie Standardvorlagen nur dann spezialisieren können, wenn die Spezialisierung von einem benutzerdefinierten Typ abhängt, der bool
offensichtlich nicht ist. Das heißt, es könnte funktionieren, wenn Ihre stdlib die Standarddefinition char_traits
hat und Sie nicht versuchen, eine Stringoperation zu verwenden, die Mitglieder von char_traits
benötigt, um etwas Nützliches zu tun.
Alternativ ist das Hacky aber könnte funktionieren:
%Vor% boolish
ist ein trivialer Typ. Solange also ein Array von boolish
die gleiche Repräsentation wie ein Array von bool
hat (was Sie für Ihren Compiler überprüfen müssten, verwendete ich static_assert
um zu überprüfen, dass kein Padding vorhanden ist, kommt man vielleicht damit davon, obwohl es wahrscheinlich gegen die Aliasregeln verstößt, weil *ptr
und *++ptr
nicht Teil des gleichen Arrays sind. Daher zeigt der Zeiger nicht auf den nächsten boolish::value
Es zeigt "über das Ende" des vorherigen (auch wenn diese beiden Orte tatsächlich die gleiche Adresse haben, obwohl [basic.compound] / 3 zu sagen scheint, dass ++ptr
auf das nächste% co_de "zeigt") %).
Die Syntax wird mit C ++ 11 etwas einfacher, Sie brauchen nicht bool
...
Alles, was Jonathan Weekly gesagt hat.
Aber ich würde einfacher gehen:
Ich würde verwenden:
Aus "Working Draft C ++, 2012-11-02"
21.1 Allgemein [strings.general]
1 Diese Klausel beschreibt Komponenten zum Bearbeiten von Sequenzen eines beliebigen Nicht-Array-POD (3.9) -Typs.21.4.1 basic_string allgemeine Anforderungen [string.require]
5 Die char-like-Objekte in einem basic_string-Objekt sollen zusammenhängend gespeichert werden. Das heißt für jeden basic_string Objekt s, die Identität & amp; * (s.begin () + n) = & amp; * s.begin () + n soll für alle Werte von n gelten, so dass 0 & lt; = n & lt; s.size ().
aber
6 Verweise, Zeiger und Iteratoren, die sich auf die Elemente einer basic_string-Sequenz beziehen, können durch die folgenden Verwendungen dieses basic_string-Objekts ungültig gemacht werden:
- als Argument für jede Standard-Bibliotheksfunktion, die einen Verweis auf nicht-const-basis_string als Argument verwendet.233
- Aufruf von nicht-konstanten Elementfunktionen, außer operator [], at, front, back, begin, rbegin, end und rend.
Sie sollten also sicher sein, solange Sie darauf achten, diese Funktionen nicht aufzurufen, während Sie das rohe Array irgendwo anders verwenden.
Aktualisieren :
Charaktereigenschaften und Anforderungen werden in 21.2 Charaktereigenschaften [char.traits] und 21.2.1 Anforderungen an Charaktereigenschaften [char.traits.require] beschrieben. Darüber hinaus werden typedefs und Spezialisierungen in 21.2.2 Eigenschaften typedefs [char.traits.typedefs] und 21.2.3 char_traits-Spezialisierungen [char.traits.specializations] bzw.
Diese Eigenschaften werden auch in der Input / Output-Bibliothek verwendet. Es gibt also Anforderungen wie eof()
oder pos_type
und off_type
, die im Zusammenhang mit basic_string
keinen Sinn ergeben.
Ich sehe keine Notwendigkeit, dass diese Merkmale tatsächlich durch eine Implementierung definiert werden, neben den vier Spezialisierungen für char
, char16_t
, char32_t
und wchar_t
.
Obwohl es in Ihrem Beispiel mit gcc 4.7 funktioniert hat, habe ich mit
ein minimalesbool_traits
definiert
%Vor%
hat die bereitgestellte Standardimplementierung (gcc 4.7) übernommen und diese wie
verwendet %Vor% Ihre Umgebung bietet möglicherweise bereits eine funktionierende Implementierung. Wenn nicht, können Sie eine einfache bool_traits
oder eine Template-Spezialisierung std::char_traits<bool>
selbst implementieren.
Sie können die vollständige Schnittstelle für Charaktereigenschaften im Arbeitsentwurf, PDF
Tags und Links c++