Angenommen, ich baue eine verkettete Liste (die reale Datenstruktur ist völlig anders, aber eine verknüpfte Liste reicht für die Frage), dessen Knoten aussehenOpaque Zeiger mit Schablonen Mitglieder auf struct
template <typename T>
struct node
{
struct node<T> *next;
T data;
};
Für meine Daten Struktur, ich habe viele Funktionen mit Rückgabetyp struct node *
, und ich möchte der Benutzer diesen Typ als undurchsichtig behandeln. Im Beispiel der verknüpften Liste könnte eine solche Funktion beispielsweise get_next(struct node<T> *n)
oder insert_after(struct node<T> *x, struct node<T> *y)
sein. Nur sehr wenige Funktionen, nämlich diejenigen, die node
s zuweisen oder ihr data
Feld bekommen, müssen etwas über T
wissen.
Gibt es eine schönere Möglichkeit, "T
" zu ignorieren und den Benutzer nur mit etwas wie einem typedef struct node * opaque_handle
für die Funktionen interagieren zu lassen, die sich nie um T
kümmern müssen? Meine Bauchreaktion, die von C kommt, ist nur zu und von void*
zu werfen, aber das klingt nicht sehr elegant.
Edit: CygnusX1 des comment hat mich überzeugt, dass ich zur gleichen Zeit für zu viele Garantien vom Typ System bin gefragt, die ich versuche, zu viele dieser Garantien zu umgehen. Ich werde darauf zurückfallen, T
void *
auf Kosten von Gießen und Indirektion zu sein.
vielleicht nicht elegant klingt, aber es weit Praxis verwendet wird. lesen Sie zum Beispiel über [pimpl] (https://en.wikipedia.org/wiki/Opaque_pointer).Haben Sie eine Forward-Deklaration 'struct T' im öffentlichen Header und verwenden Sie' T * 'in' struct node' (muss in diesem Fall keine Vorlage sein) – mvidelgauz
Gibt es eine spezielle Notwendigkeit, Ihre Datenstruktur so zu gestalten, dass macht den 'node' Typ? Warum modellieren Sie es nicht nach den anderen Containern im Standard (Benutzeroberflächenfunktionen geben 'T' anstelle von' Knoten 'zurück)? –
user2296177
Sie möchten vielleicht sehen, wie Sammlungen [STL] (http://www.cplusplus.com/reference/list/list/) mit dem Problem umgehen. Sie geben dem Endbenutzer nicht den Zugriff auf die Implementierungsstruktur, wie z. 'Knoten'. Ihre Schnittstelle enthält eine Zusammenfassung, die für Endbenutzertypen wie "Iterator", "Werttyp", "Referenz" und so weiter verständlich ist. –