‘class std::vector<bool>’ has no member named ‘emplace_back’


  • Mod

    Vergiss es. Erinnerte mich dunkel daran, dass STD_VECTOR_BOOL_NOT_SPECIAL funktioniert, aber das ist ja doch nicht im Standard.

    Frage mich, wieso eigentlich.

    Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.



  • Arcoth schrieb:

    Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.

    Hä?


  • Mod

    vector<fool> schrieb:

    Ich habe das in Templates und es wäre sehr verwirrend dem Benutzer zu verbieten, bool einzusetzen. Und per Template bool mit char zu ersetzen geht leider nicht.

    evtl.

    template <typename T, typename... Args>
    void emplace_back(T&& c, Args&&... args)
    {
        c.emplace_back(std::forward<Args>(args)...);
    }
    template <typename A, typename Arg>
    void emplace_back(std::vector<bool, A>& c, Arg&& arg)
    {
        c.push_back(std::forward<Arg>(arg));
    }
    template <typename A>
    void emplace_back(std::vector<bool, A>& c)
    {
        c.push_back(false);
    }
    

    Edit: nochmal korrigiert, für den Fall das Argument kein bool ist (dann würde sonst das allgemeine Template verwendet werden).



  • camper schrieb:

    vector<fool> schrieb:

    Ich habe das in Templates und es wäre sehr verwirrend dem Benutzer zu verbieten, bool einzusetzen. Und per Template bool mit char zu ersetzen geht leider nicht.

    evtl.

    template <typename T, typename... Args>
    void emplace_back(T&& c, Args&&... args)
    {
        c.emplace_back(std::forward<Args>(args)...);
    }
    template <typename A>
    void emplace_back(std::vector<bool, A>& c, bool b = false)
    {
        c.push_back(b);
    }
    

    Super, darauf wär ich nicht gekommen. Das ist besser als meine ganzen Hacks, die ich mir überlegt habe.


  • Mod

    Ich dachte, du darfst die Syntax nicht ändern. So ist es natürlich etwas anderes.

    @camper: Wieso für das erste (allgemeine) Funktionstemplate Temporaries erlauben?

    volkard schrieb:

    Arcoth schrieb:

    Edit, @SeppJ: Der GCC bspw. erlaubt das AFAICS nicht.

    Hä?

    Was ist daran unverständlich?
    Edit: Die Spezialisierung von vector liegt im Header <bits/stl_bvector.h> , und die wird in <vector> bedingungslos eingebunden. Es gibt auch keine #if(n)defs , welche da irgendetwas ausschließen.



  • Jetzt reichts, ich schreibe mir einen true_vector ohne diese dummen Spässe

    Lebe damit! vector<bool> und deren Probleme sind lange bekannt und werden genauso wie auto_ptr nicht aus der Bibliothek herausgenommen.

    Loesung: Benutze std::bitset oder boost::dynamic_bitset!


  • Mod

    knivil schrieb:

    Loesung: Benutze std::bitset oder boost::dynamic_bitset!

    Welches vector<bool>-Problem wird denn von bitset gelöst, außer dass bitset nicht vorgaukelt, ein vector zu sein? (Abgesehen davon, dass der TE die Ersetzung umgekehrt möchte)



  • außer dass bitset nicht vorgaukelt, ein vector zu sein?

    bitset gaukelt nicht vor, ein vector zu sein. 🙂



  • vector<fool> schrieb:

    Und per Template bool mit char zu ersetzen geht leider nicht.

    Hm??

    std::conditional<std::is_same<T,bool>::value, char, T>::type
    


  • ScottZhang schrieb:

    std::conditional<std::is_same<T,bool>::value, char, T>::type
    

    Nicht so knorke:

    template<class T>
    class MyClass{
    //...
        T& operator[](std::size_t i){
            return elements[i];
        }
    private:
        std::vector<typename std::conditional<std::is_same<T,bool>::value, char, T>::type> elements;
    };
    

  • Mod

    Und der überladene Operator gibt dann wieder eine Referenz auf bool zurück? 🤡

    Falls tatsächlich das auslagern von emplace_back (und anderen relevanten Funktionalitäten) in spezialisierbare Einheiten nicht möglich ist, gibt es noch

    template<typename T>
    using Vector = std::vector< typename std::conditional<std::is_same<T,bool>::value, char, T>::type >;
    


  • Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?



  • but why schrieb:

    Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?

    wieder ein ballmer peak?


  • Mod

    volkard schrieb:

    but why schrieb:

    Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?

    wieder ein ballmer peak?

    Nein, sie haben Herr Bebel vor kurzem entlassen - habt ihr das nicht mitbekommen?

    Es dachten die Experten vom Komitee, dass ein emplace_back für vector<bool> prinzipiell unnötig ist (Perfect Forwarding ist für bool ja tatsächlich Überflüssig).



  • Arcoth schrieb:

    volkard schrieb:

    but why schrieb:

    Die eigentliche Frage ist doch, wieso bietet vector<bool> kein emplace_back an?

    wieder ein ballmer peak?

    Nein, sie haben Herr Bebel vor kurzem entlassen - habt ihr das nicht mitbekommen?

    Es dachten die Experten vom Komitee, dass ein emplace_back für vector<bool> prinzipiell unnötig ist (Perfect Forwarding ist für bool ja tatsächlich Überflüssig).

    Naja, das Statement ist immernoch besser als der ganze Code, den Du nüchtern produzierst.



  • Die Spezialisierung radikal auskommentieren in der STL! Ohne wenn und aber, hier wird kurzer Prozess gemacht! Und dann dynamic_bitset hernehmen, um den ganzen boost-Firlefanz erleichtern, namespace anpassen und in den STL-Ordner schieben! Problem gelöst!


  • Mod

    volkard schrieb:

    Naja, das Statement ist immernoch besser als der ganze Code, den Du nüchtern produzierst.

    video meliora proboque, deteriora sequor. 🙂

    Edit:

    Die Spezialisierung radikal auskommentieren in der STL! Ohne wenn und aber, hier wird kurzer Prozess gemacht!

    Ja, das ist eine Möglichkeit. Bloß nicht, dass dann aber merkwürdige Fehler in anderen Stellen anderer Header kommen.



  • In welchen genau, ich hab's jetzt noch nicht probiert? Ich denke die Menge an zerstörtem Code, global gesehen, würde sich in überschaubarem Rahmen halten, aber ist nur so eine Vermutung. Und derjenige, der den Code geschrieben hat, hat's ja auch verdient... Wenn ich nen bitset haben will, dann nehme ich auch eins.
    Wenn man den "Tag des vector<bool>" einführt, könnte man zudem auf die Problematik hinweisen.



  • Arcoth schrieb:

    Und der überladene Operator gibt dann wieder eine Referenz auf bool zurück? 🤡

    du hast mehr oder weniger verstandn warum ich geschrieben hab: "nicht so knorke" aka: "Löst das Problem nicht" aka "verschiebt das Problem nur ein Ebene höher"



  • mal nicht so unkreativ, die Rede war von austauschen

    template<class T>
    class MyClass{
        typedef typename std::conditional<std::is_same<T,bool>::value, char, T>::type value_type;
    //...
        value_type& operator[](std::size_t i){
            return elements[i];
        }
    private:
        std::vector<value_type> elements;
    };
    

Anmelden zum Antworten