13 Stimmen

C++ Wie übergebe ich eine Liste von Nicht-Konstanten an eine Funktion, die eine Liste von Konstanten benötigt?

Ich habe eine Funktion mit einer Signatur

void Foo(list<const A*>)

und ich möchte ihm eine

list<A*>

Wie kann ich das tun? (Bitte beachten Sie - die Liste ist nicht konstant, nur das Mitglied der Liste)

19voto

Jerry Coffin Punkte 452852

Das Problem, das Sie haben, ist, dass, obwohl T * kann implizit in eine T const * Das Vorlagensystem ist sich dessen nicht "bewusst", so dass eine whatever<T *> y whatever<T const *> sind völlig unterschiedliche Typen, und es gibt keine implizite Konvertierung von einem zum anderen.

Um das Problem zu vermeiden, würde ich es wahrscheinlich vermeiden, überhaupt eine Sammlung zu übergeben. Stattdessen würde ich der Funktion ein Paar von Iteratoren übergeben. A list<A *>::iterator puede stillschweigend in eine list<A *>::const_iterator . Aus diesem Grund würde ich die Funktion wahrscheinlich zu einer Vorlage machen, damit sie Iteratoren beliebigen Typs annehmen kann.

Dies wird Ihnen wahrscheinlich eine Menge Ärger ersparen - eine list ist nur selten eine gute Wahl für einen Container, so dass die Wahrscheinlichkeit sehr groß ist, dass Sie eines Tages von list<A *> a vector<A *> oder vielleicht deque<A *> -- und wenn Sie Ihre Funktion generisch machen, können Sie das tun, ohne die Funktion überhaupt neu zu schreiben.

0voto

Josh Punkte 148

Sie können einfach eine neue Liste erstellen und diese mit den Werten aus Ihrer ursprünglichen Liste füllen. Das ist vielleicht nicht die effizienteste Lösung, was die Laufzeit- und Speicherverwaltung betrifft, aber sicherlich einfach zu programmieren:

list<A*> list1;
list<const A*> list2;
for(list<A*>::iterator a=list1.begin(); a!=list1.end(); a++) list2.push_back(*a);

0voto

MSalters Punkte 166675

Sie müssen eine Kopie der Liste erstellen - es ist ein pass-by-value-Argument. Es gibt eine recht einfache Möglichkeit, eine Kopie zu erstellen, da die Elementtypen eine implizite Konvertierung haben: Alle STL-Container können aus einem Paar von Iteratoren erstellt werden. Also, in Ihrem Fall:

std::list<A*> src;
Foo(std::list<const A*>(src.begin(), src.end()));

Dies ist etwas schwieriger, als es sein müsste, da die STL Bereiche als Paare von Iteratoren darstellt und die C++-Konvertierungsregeln mit einzelnen Objekten arbeiten.

-2voto

Kunya Punkte 26

Ich glaube, Sie können es so weitergeben, wie es ist. Denken Sie daran, dass Non-Const-Typen an etwas übergeben werden können, das einen Const-Typ erwartet, aber nicht andersherum!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X