std::pair und std::make_pair



  • Nehmen wir an ich habe ein

    str::pair<double,int> DATA;
    

    Paar.

    Nun kann ich ja mit make_pair

    DATA= std::make_pair(9.933,4);
    

    das Paar zuweisen..

    nun , wohrer weis make_pair, das ich die typen double und int zuweise?



  • BorisDieKlinge schrieb:

    nun , wohrer weis make_pair, das ich die typen double und int zuweise?

    Aus dem Kontext. Wenn der Compiler meint dass der Kontext nicht hinreichend ist, musst du std::make_pair<double, int>(9.933,4) schreiben.



  • wie sieht der compiler da einen zusammenhang?

    er sieht ja durch das pair welche Typen es beinhaltet, und castet so die zwei variabeln die ich zuweise auf die Typen?



  • BorisDieKlinge schrieb:

    wie sieht der compiler da einen zusammenhang?

    In deinem Beispiel sieht der Compiler sieht die Deklaration von DATA und weiss daher, was fuer ein pair benoetigt wird.



  • Christoph schrieb:

    In deinem Beispiel sieht der Compiler sieht die Deklaration von DATA und weiss daher, was fuer ein pair benoetigt wird.

    Nicht ganz. die Deduktion von Templateparametern bezieht sich ausschließlich auf die Parameter, nicht auf den Rückgabewert. Der Compiler weiss bei einem Aufruf von pair<T,U> mit (9.993, 4) dass T ein double und U ein int sein muss. Bei der Zuweisung des Ergebnisses von make_pair an das pair-Objekt findet dabei ggfs. sogar noch eine Umwandlung statt (hier nicht).



  • LordJaxom schrieb:

    Christoph schrieb:

    In deinem Beispiel sieht der Compiler sieht die Deklaration von DATA und weiss daher, was fuer ein pair benoetigt wird.

    Nicht ganz. die Deduktion von Templateparametern bezieht sich ausschließlich auf die Parameter, nicht auf den Rückgabewert. Der Compiler weiss bei einem Aufruf von pair<T,U> mit (9.993, 4) dass T ein double und U ein int sein muss. Bei der Zuweisung des Ergebnisses von make_pair an das pair-Objekt findet dabei ggfs. sogar noch eine Umwandlung statt (hier nicht).

    Oh, stimmt, die Sache mit dem Rueckgabewert. Das kommt vom Haskell-Programmieren, da ist das alles ein wenig einheitlicher und simpler. 😉



  • Christoph schrieb:

    Oh, stimmt, die Sache mit dem Rueckgabewert. Das kommt vom Haskell-Programmieren, da ist das alles ein wenig einheitlicher und simpler. 😉

    Naja, was heißt "einheitlicher". Haskell betreibt type inference und C++, ganz einheitlich, nicht.



  • Warum so kompliziert?

    Mit C++ kann/sollte man ja seine Konstanten kennzeichnen:

    123 // int
    123u // unsigned int
    123l // long
    123ul // unsigned long
    123.0f // float
    123.0 // double
    123.0l // long double
    "Hallo Welt" // const char*
    

    std::make_pair(123.0, 456) ist damit eindeutig <double, int>

    Grüße...

    Heiko



  • bwbg schrieb:

    std::make_pair(123.0, 456) ist damit eindeutig <double, int>

    Ja, ist es - du kannst den Rückgabewert aber auch an (z.B.) ein pair<float,long> zuweisen, wenn das benötigt wird. (std::pair<> hat einen Template-CopyCtor, der alle pair<>-Spezialisierungen schluckt, deren Typen in die eigenen Membertypen konvertiert werden können - das ermöglicht auch Umwandlungen ala pair<string,double> p=make_pair("Hallo",4711); )



  • bwbg schrieb:

    ...

    123.0 // double
    123.0l // long double
    

    ...

    😮
    Blöder Font (kein Fehler von Dir und auch nicht vom Forum - ist überall so), bei dem

    1==l
    

    ist ... 😉 😃
    Hat mich doch eine zeitlang verwirrt...

    Gruß,

    Simon2.



  • Christoph schrieb:

    LordJaxom schrieb:

    Nicht ganz. die Deduktion von Templateparametern bezieht sich ausschließlich auf die Parameter, nicht auf den Rückgabewert.

    Oh, stimmt, die Sache mit dem Rueckgabewert. Das kommt vom Haskell-Programmieren, da ist das alles ein wenig einheitlicher und simpler. 😉

    Seit wann benutzt Haskell den Rückgabewert zum Bestimmen des Aufrufs?


Anmelden zum Antworten