Lassen Sie uns den nächsten Code betrachten:Noch eine Optimierung mit Rvalue Referenz &&. Einfach umbenennen Felder
struct Channel; // somewhere declared
using iter_t = std::set<Channel>::iterator;
std::set<Channel> myset;
std::pair<iter_t, bool> emplaced = myset.emplace(arg1,arg2);
Dann Iterator Element emplaced.first
enthält, wurde emplaced.second
zeigt an, ob Element hinzugefügt oder bereits vorhanden sind. zuerst und Sekunde ist nicht klar, wie für mich. Ich möchte diese Felder umbenennen:
struct ChannelAddedResult
{
iter_t channelIter;
bool wasAdded;
public: // --- Functions, constructors ---
ChannelAddedResult(std::pair<iter_t, bool> &&pa) {
this->channel = pa.first;
this->added = pa.second;
}
};
Dieser Konstruktor kopiert Werte. Und hier ist kein Gewinn von Rvalue Referenz. Recht?
Aber wie kann ich std::pair<iter_t, bool>
zu ChannelAddedResult
konvertieren? Diese Typen sind gleichwertig. So C
-Stil Gespräch könnte wie folgt aussehen:
union CarUni {
std::pair<iter_t, bool> pair;
ChannelAddedResult car;
}
// Use
CarUni u;
u.pair = myset.emplace(arg1,arg2);
auto ch = *u.car.channelIter;
bool a = u.car.wasAdded;
Dies ermöglicht ohne zusätzliche Kopien umbenennen zu erreichen. Kann sein C
-casting (ChannelAddedResult)emplaced_pair
wird die gleiche Arbeit, aber es ist in C++ veraltet. Diese 2 Umbauten sind aus der Sicht der Typsicherheit gefährlich.
Gibt es einen C++ 11-Weg für eine solche Umwandlung?
Wo ist dieses Gespräch im C-Stil? Das ist alles C++. Und C-Style-Umwandlungen (die Sie * in Ihrem Beispiel * nicht verwendet haben) sind in C++ nicht veraltet. Alles in allem scheint Ihr Code gut und in keiner Weise "gefährlich vom Typ der Sicherheit". Worum geht es dir genau? –
'std :: pair & emplaced == myset.emplace (arg1, arg2);' sollte 'std :: pair & emplaced = myset.emplace (arg1, arg2) sein;' –
badola
' std :: pair & emplaced == myset.emplace (arg1, arg2); 'vermeiden Sie es, Code zu posten, der aus Gründen, die nichts mit Ihrer Frage zu tun haben, nicht kompiliert wird. Ich denke, es gibt zwei Tippfehler, aber ... wenn es Tippfehler gibt, wie viele andere zufällige Funktionen Ihres Codes sind Tippfehler, die Sie nicht vorhatten? –
Yakk