In Visual C++ 2008, nein, das ist ungefähr so "elegant", wie es nur geht. Die Standardbibliothek stellt Algorithmen zur Verfügung, mit denen Container manipuliert werden können. In den meisten Szenarien - besonders in einfachen Anwendungsfällen wie diesem - sind sie jedoch viel zu umständlich zu verwenden.
C++ 11 fügt Lambda-Ausdrücke zu C++ hinzu. Visual C++ 2010 und aktuelle Versionen anderer C++ - Compiler unterstützen diese C++ 11-Funktion. Mit Lambda-Ausdrücke, können Sie leicht den transform
Algorithmus für die Aufgabe verwenden:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
[](Foo const& x) { return x.b; });
ohne Lambda-Ausdrücke, dann würden Sie eine Funktion zum Extrahieren der b
Element aus der Struktur definieren müssen:
long get_b(Foo const& x) { return x.b; }
Sie könnten dann diese Funktion mit dem transform
Algorithmus verwenden:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);
jedoch für einfache Anwendungsfälle wie diese, kann diese qu Dies führt zu einem unhandlichen Code, da es schwierig ist, alle verwandten Funktionen zusammen zu halten.
Und natürlich gibt es andere Techniken, wie Boost.Lambda, oder das Schreiben von Allzwecktransformatoren und deren Verwendung mit den Standardbibliotheksbindern, aber keine dieser Techniken könnte als eleganter angesehen werden als im ursprünglichen Code . –
Sie können auch 'std :: bind (& Foo :: b)' verwenden, um eine Signaturfunktion 'long & (Foo &)' zu bekommen, denke ich. –
Ich habe versucht, 'bind' komplett aus meinem Gedächtnis zu verbannen, obwohl ich fürchte, dass einige Narben für immer bestehen bleiben. : -O –