006
23.08.2008, 12:45 Uhr
0xdeadbeef
Gott (Operator)
|
Moin,
Ich hatte das hier schon fast wieder vergessen, tut mir leid...
Also, die Lösung für die Vorlage ist denkbar simpel:
C++: |
class Element { public: Element *siblingAt(std::size_t index) { return sib_aux<Element*>(this, index); } Element const *siblingAt(std::size_t index) const { return sib_aux<Element const *>(this, index); }
private: template<typename T> static T sib_aux(T c, std::size_t index) { assert( index >= 0 ); assert( index <= c->countSiblings() ); while(c->m_prevsibling) c = c->m_prevsibling;
for(int i=0; i <= index; ++i) c = c->m_nextsibling;
return c; } };
|
...aber wie gesagt, ich würde hier wirklich einen echten Listenkopf benutzen. Die Art der Listenverwaltung, die du da benutzt, macht eigentlich nur dann Sinn, wenn jedes Element seine eigene Liste darstellt (das ist für bestimmte mathematische Erwägungen sinnvoll), und jede Operation deshalb vom Element selbst ausgeht, also siblingAt(1) z.B. *m_nextsibling zurückgäbe. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |