Warum ist std::pair<A,B>
nicht dasselbe wie std::tuple<A,B>
? Es war schon immer komisch, nicht einfach das eine durch das andere ersetzen zu können. Sie sind etwas konvertierbar, aber es gibt Beschränkungen.Warum ist std :: pair <A,B> nicht dasselbe wie std :: tuple <A,B>? (Gibt es wirklich keinen Weg?)
Ich weiß, dass std::pair<A,B>
erforderlich ist, um die zwei Datenelemente A first
und B second
haben, so kann es nicht nur eine Art Alias std::tuple<A,B>
sein. Aber meine Intuition sagt, dass wir std::tuple<A,B>
spezialisieren könnten, das ist ein Tupel mit genau zwei Elementen, um die Definition dessen, was der Standard erfordert, std::pair
zu sein. Und alias dies zu std::pair
.
Ich denke, das wäre nicht möglich, da es zu einfach ist, um nicht schon daran gedacht zu werden, aber es wurde nicht in g ++ 's libstdC++ zum Beispiel getan (Ich sah nicht den Quellcode von anderen Bibliotheken). Was wäre das Problem dieser Definition? Ist es "nur", dass es die Binärkompatibilität der Standardbibliothek durchbrechen würde?
Möglicherweise aufgrund von Implementierungseinschränkungen (Tupel werden rekursiv implementiert, indem Sie entweder ein Unterobjekt mit kürzerem Tupeltyp verwenden oder davon erben). Jedes Tupel der Größe> = 3 würde mit den Mitgliedern dort enden. –
@Revolver_Ocelot Hmm guter Punkt ... Aber was ist mit einigen rekursiven 'tuple_impl' (wie das aktuelle Tupel implementiert ist), dann alias' tuple = tuple_impl' für 0, 1 und> = 3 Elemente, aber 'tuple = pair_impl 'für 2 Elemente sowie' Paar = Tupel '. Ich hoffe du verstehst das. Grundsätzlich eine weitere Alias-Indirektion, die rekursive Implementierungsdetails versteckt. – leemes
@Revolver_Ocelot Moderne 'Tupel'-Implementierungen sind nicht rekursiv. – Columbo