std::tuple get () - member-Funktion
boost::tuple
hat eine get()
member-Funktion wie folgt verwendet:
tuple<int, string, string> t(5, "foo", "bar");
cout << t.get<1>(); //outputs "foo"
Scheint es den C++0x - std::tuple
nicht über diese member-Funktion ist, und Sie haben, um stattdessen die nicht-member-Funktion der form:
std::get<1>(t);
welche mir sieht hässlicher.
Gibt es einen bestimmten Grund, warum std::tuple
nicht die member-Funktion? Oder ist es nur meine Umsetzung (GCC 4.4)?
Als Faustregel für den Entwurf, nicht-member-Funktionen zu bevorzugen sind, sowieso.
InformationsquelleAutor HighCommander4 | 2010-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ab C++0x draft:
Dies kann illustriert werden mit diesem code:
In der Erwägung, dass verstehe ich dein argument, boost-Kompatibilität allein ist kein ausreichender Grund, auf seiner eigenen, da die Kompatibilität zu bestehenden Lösungen sein sollte nicht nur treibende Kraft für die Bereitstellung von etwas, das in einer neuen standard-und auch der boost ist nicht das non-plus-ultra und können profitieren von einigen der revision. Diese Allgemeinen Worte gesagt, die ich noch Zustimmen, dass die-
get
s wäre eine gute Idee.Nun haben wir die C++11, die nicht mehr erfordern-Vorlage Schlüsselwort, können wir völlig haben eine member-Funktion jetzt? Nur ein Vorschlag benötigt?
InformationsquelleAutor doublep
Den vorhandenen Antworten sind toll und sicher auch für die Normen-Ausschuss seien unerlässlich für diesen Zweck. Aber es gibt ein weiteres Problem, das ich denke, ist wichtig genug zu erwähnen.
Mit kostenlosen Funktionen, haben Sie die Möglichkeit zum ändern einer Schnittstelle ohne das ändern der definition einer Klasse. Sie können jeden Typ "get erreichbar" einfach durch die Spezialisierung der globalen
get
. Mit einer member-Funktion wäre, müsste man direkt die Klasse ändern.Range-basierte
for
sieht für diebegin/end
auf Klasse Typen, aber es sieht auch für nicht-Mitgliederbegin/end
via ADL. Diese APIs können verwendet werden, mit jedem container, auch diejenigen, die nicht habenbegin/end
Funktionen. Sie spezialisieren Sie sich zum Beispiel für die LibXML2-element-Typen, so dass Sie die range-basiertefor
überxmlElement*
's.Können Sie nicht tun, dass, wenn Sie werden member-Funktionen.
In C++ freie Funktionen sind eine Natürliche Schnittstelle für viele Operationen, die getan werden könnte auf viele verschiedene Arten von Klassen.
std::begin/std::end
sind auch gute Beispiele dafür, wie member und nicht-member-Funktionen arbeiten können sehr schön zusammen. Sie können entweder mit den meisten Containern.InformationsquelleAutor Nicol Bolas
N3090/3092, §20.4.2.6/8: "Hinweis: Der Grund ist ein nicht-Funktion ist, dass, wenn diese Funktionalität zur Verfügung gestellt worden waren, wie eine member-Funktion, code, in dem der Typ hing auf einem template-parameter erforderlich wäre die Verwendung der Vorlage Schlüsselwort. —Ende Hinweis"
InformationsquelleAutor Jerry Coffin