std::tuple und uniform initialization



  • Ich kann kein std::tuples mit uniform initialization initialisieren, weil der Konstruktor explicit ist, z.B. geht das nicht:

    std::vector<std::tuple<std::string,int,int>> xyz{{"a",0,1},{"b",2,3},{"c",2,3}};
    

    Gibt es einen guten Grund dafür und wenn nicht, gibt es bessere Implementationen (boost vielleicht)?



  • Zumindest meine zweite Frage kann ich selbst beantworten, mit boost::tuple geht es.
    Allerdings wäre mir eine tuple-Implementation, die keine gigantischen Abhängigkeiten wie boost benötigt viel lieber.


  • Mod

    Gibt es einen guten Grund dafür

    Offensichtlich keinen technischen. Nein, es ist natuerlich moeglich. Nur ist die Initialisierung von Tuples auf diesem Wege nicht der Ideologie entsprechend.

    Mein Vorschlag ist simpel: Du schreibst einen Tupel-Wrapper, der diese Form von Initialisierung anbietet. 👍



  • Arcoth schrieb:

    Nur ist die Initialisierung von Tuples auf diesem Wege nicht der Ideologie entsprechend.

    Kommt mir aber merkwürdig vor, dass man ein eigentlich nützliches Feature einbaut, das dann aber wieder dadurch negiert, indem man auch alle möglichen neuen Typen einführt, welche absichtlich damit inkompatibel sind.

    Arcoth schrieb:

    Mein Vorschlag ist simpel: Du schreibst einen Tupel-Wrapper, der diese Form von Initialisierung anbietet. 👍

    Super, danke. Das klang in meinem Kopf erst mal einige Größenordnungen komplizierter, aber im Prinzip hab ich das gewünschte schon mit drei Zeilen erreicht:

    template <class... Args> struct Tuple : std::tuple<Args...>
    {
      Tuple(Args... args) : std::tuple<Args...>(std::move(args)...) {}
    };
    

  • Mod

    Tuple(Args... args) : std::tuple<Args...>(std::move(args)...) {}
    

    Wieso keine Const-Referenzen, sondern Kopie+Move?



  • Das war so gedacht, dass ich wenn ich temporäre Objekte übergebe, keine Kopie gemacht werden muss, sondern nur zwei Moves ausgeführt werden. Aber ich habe gerade gemerkt, dass nur einmal gemovet wird, std::tuple macht dann doch noch eine Kopie. Das versteh ich allerdings nicht, was gibt es da zu kopieren?



  • Gibt es einen Grund gegen

    std::vector<std::tuple<std::string,int,int>> xyz{make_tuple("a",0,1),make_tuple("b",2,3),make_tuple("c",2,3)};
    

    ?


  • Mod

    Gibt es einen Grund gegen

    Ja, sieht scheiße aus!

    Das war so gedacht, dass ich wenn ich temporäre Objekte übergebe, keine Kopie gemacht werden muss, sondern nur zwei Moves ausgeführt werden.

    Ach, und wenn die Objekte eben nicht temporär' sind!?



  • Arcoth schrieb:

    Ach, und wenn die Objekte eben nicht temporär' sind!?

    Dann ist egal, spätestens std::tuple hätte ja in diesem Fall kopieren müssen. So mache ich das und move dann zum std::tuple-Konstruktor. Hätte eigentlich so klappen müssen, wenn std::tuple nicht unnötigerweise nochmal kopieren würde...


Anmelden zum Antworten