Als std::vector
(oder C++ im Allgemeinen) nicht covariant Aggregation unterstützt, gibt es keine syntaktisch hübsche Weise zu tun, was Sie wollen.
Wenn Sie wirklich wollen initialisierenall_x
mit x
Mitglieder obj
Elemente, dann können Sie einen neuen Iterator-Klasse definieren, wie folgt aus:
class getx_iter : public vector<Object>::iterator
{
public:
getx_iter(const vector<Object>::iterator &iter) : vector<Object>::iterator(iter) {}
int operator*() { return (*this)->x; }
};
Working code example
Wenn Sie in Ordnung sind mit initialisieren eine leere vector
und dann füllen sie, std::transform
mit einem labmda ist eine klarere option (wie @andars vorgeschlagen).
Sie könnten auch zusätzliche Initialisierung vermeiden, indem vector::reserve()
und back_inserter
mit:
xs.reserve(foos.size());
std::transform(foos.begin(), foos.end(), back_inserter(xs), [](Foo f){return f.x;});
Beachten Sie auch, dass, während x
ein privates Mitglied Object
und hat keine Getter, wird es sehr schwierig sein, sie zu extrahieren.
Sie Mitglied verwenden können anstelle des Makros Zeiger: '& Foo :: x '. – Jarod42