Bisher habe ich nur Gewerkschaften zum Speichern entweder Mitglied A oder Mitglieds B.
ich mich jetzt in dem Fall, wo ich Änderung während der Laufzeit das verwendete Mitglied werden soll.
C++ Union Nutzung
union NextGen {
std::shared_ptr<TreeRecord> Child = nullptr;
std::vector<std::shared_ptr<TreeRecord>> Children;
};
Meine heutige Nutzung:
void TreeRecord::AddChild(const std::shared_ptr<TreeRecord>& NewChild) {
if(_childCount == 0) {
_nextGeneration.Child = NewChild;
_childCount++;
} else if(_childCount == 1) {
//This is not clear to me:
//Do I have to set Child to nullptr first?
//Do I need to clear the Children vecor?
//Or will it work like this?
_nextGeneration.Children.push_back(_nextGeneration.Child);
_nextGeneration.Children.push_back(NewChild);
_childCount++;
} else {
_nextGeneration.Children.push_back(NewChild);
_childCount++;
}
}
Neue Implementierung (versuchen):
typedef std::shared_ptr<TreeRecord> singlechild_type;
typedef std::vector<std::shared_ptr<TreeRecord>> children_type;
union {
singlechild_type _child;
children_type _children;
};
void TreeRecord::AddChild(const singlechild_type& NewChild) {
if(_childCount == 0) {
_child = NewChild;
_childCount = 1;
} else if(_childCount == 1) {
singlechild_type currentChild = _child; //Copy pointer
_child.~singlechild_type(); //Destruct old union member
new (&_children) children_type(); //Construct new union member
_children.push_back(currentChild); //Add old child to vector
_children.push_back(NewChild); //Add new child to vector
_childCount = 2;
} else {
_children.push_back(NewChild);
_childCount++;
}
}
Dachte nicht einmal darüber! Was meinst du mit "im Allgemeinen" –
Dies ist die richtige Antwort, aber es wäre nett, wenn Sie es ausarbeiten. – mostruash
Ich werde keinen ein elem Vektor haben. Ich benutze entweder Kind für 0 oder 1 Elem und ich wechsle zu Vektor für mehr Elems als 1. Oder habe ich einen Fehler gemacht ...? (Ich lese immer noch Ihren Code) Und ich verwende eine getaggte Union, nur nicht mit einem booleschen Bezeichner, sondern mit "size_t _childCount", was 0 oder 1 ist, wenn Child verwendet wird. –