Arbeite für vectorbool, benutze basic_stringbool?

7

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.

    
Neil Kirk 07.03.2013, 14:38
quelle

3 Antworten

15

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

%Vor%     
Jonathan Wakely 07.03.2013 14:46
quelle
3

Alles, was Jonathan Weekly gesagt hat.

Aber ich würde einfacher gehen:
Ich würde verwenden:

%Vor%     
Martin York 07.03.2013 15:18
quelle
1

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 minimales bool_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 oder cppreference.com - std :: char_traits .

    
Olaf Dietsche 07.03.2013 16:41
quelle

Tags und Links