Referenz auf Element eines std::vector<bool>



  • Hallo zusammen,

    ich habe bei mir einen API Aufruf, der einen bool * entgegen nimmt. Die Anzahl der bool Variablen für den ich den Aufruf machen muss, steht erst zur Laufzeit fest (wird aber keine große Anzahl sein, vermutlich immer <= 5).

    Naheliegend für das Vorhalten der Daten wäre ja ein std::vector<bool>... Nur ist das ja eine Spezialisierung, die mit typischen Eigentschaften eines Vektores bricht. Zum Beipsiel gibt der [] Operator keine Referenz auf einen Bool zurück, was genau das wäre, was ich bräuchte.

    Wie würdet ihr das Lösen?
    Einen anderen Container nehmen, z.B. std::deque<bool> (momentan meine bevorzugte Lösung),
    oder den Bool in einem Struct Kapseln und einen stc::vector<myBool> oder so was machen?
    Oder vielleicht einen ganz eigenen Container dafür schreiben?
    Oder einen Wrapper um einen std::vector<char> basteln, der mir nach außen das Bool Inteface gibt?

    Ach: Boost habe ich bisher nicht in dem Projekt. Da gäbe es eine Vektor Lösung wirklich auf bool, soweit ich weiß. Aber nur dafür Boost mit ins Boot holen, scheint mir auch übertrieben.



  • Ich würde nen std::vector<char> nehmen und einen Wrapper für die aufzurufende Funktion bauen. Statt der eigentlichen Funktion rufste dann den Wrapper auf und im Wrapper machst du die Konvertierung hin -und zurück.

    void function_wrapper( char& val )
    {
       bool tmp = val;
       wrapped_function( &tmp );
       val = tmp;
    }
    


  • Das wird in dem Fall nicht gehen. Hätte ich dazu schreiben müssen, der Pointer muss über den Funktionsaufruf gültig bleiben.
    Im Prinzip wird in den Bool geschrieben ob eine Checkbox auf der GUI ausgewählt ist, oder nicht.



  • @Schlangenmensch sagte in Referenz auf Element eines std::vector<bool>:

    vermutlich immer <= 5

    Da würde ich nicht lange nachdenken und std::deque nehmen.



  • 2007 gab es schon mal einen Vorschlag zum Entfernen der Spezialisierung von vector<bool>: Library Issue 96: Fixing vector<bool>

    Hoffentlich wird der aktuelle Vorschlag Deprecate std::vector<bool>, promote std::tr2::dynamic_bitset and map a timeline for C++23 bald umgesetzt.



  • @Schlangenmensch Müssen die bool für den Aufruk "kompakt" liegen? Oder wird immer nur ein Zeiger auf einen bool übergeben - nur das halt mehrfach?
    Wenn du nur einen bool brauchst, dann wäre die einfachste Lösung vermutlich vector<BoolWrapper>.

    ps: Wenn sich die Grösse nicht zur Laufzeit ändert ginge auch noch unique_ptr<bool[]>.



  • @hustbaer Es wird immer nur ein Zeiger auf einen bool übergeben, aber das mehrfach. Die Größe ist erst zur Laufzeit bekannt, muss sich aber nicht zur Laufzeit auch ändern können unique_ptr<bool[]> wäre also auch eine Alternative.

    Ich hab's erstmal die deque<bool> Variante genommen. Aber da mir das Problem tatsächlich heute zum ersten mal unter gekommen ist, hätte mich interessiert ob es einen "üblichen" Weg gibt.


Log in to reply