Wie kann ich eine Vector Wrapper-Klasse verwenden, wenn sie in einem anderen Vektor eingeschlossen ist?

8

Betrachten Sie eine freie Funktion aus einer dritten Teilbibliothek, die ein std::vector als Argument erwartet: void foo( std::vector<sometype>& );

Jetzt schreibe ich einen Wrapper um diesen Typ, damit ich Memberfunktionen hinzufügen kann. Um foo() mit diesem Typ verwenden zu können, füge ich eine Zugriffsfunktion hinzu.

%Vor%

Auf diese Weise kann ich foo() immer noch verwenden:

%Vor%

Betrachten Sie nun aber eine andere Funktion, die einen Vektor von Vektoren von sometype erwartet ( edit: und fügt Elemente in diesen Vektor ein ):

%Vor%

Aber der Datentyp, den ich habe, ist std::vector<Wrapper> vec;

Gibt es eine Möglichkeit, meinen Wrappertyp zum Aufrufen von bar() ? zu verwenden? Was ich tun möchte, ist dies:

%Vor%

Der Punkt, den ich vermeiden möchte, ist der erste Aufruf von bar() mit dem erforderlichen Typ und das anschließende Kopieren der Elemente in mein vector<Wrapper> .

Zuerst würde ich "Nein" sagen, aber vielleicht gibt es eine kluge Lösung?

Edit2 : Um ein Beispiel zu geben, betrachten Sie die folgende Spielzeug-Implementierung für bar() mit einem int root-Datentyp:

%Vor%     
kebs 12.05.2015, 09:41
quelle

4 Antworten

3

[Bearbeitung nach neuen Kommentaren, die in der Balkenfunktion hinzugefügte Elemente erfordern] Eine mögliche Lösung wäre, ein std::vector<std::vector<sometype>> für die zu verwendende Funktion zu behalten und nur mit einem VectorAccessor object zu arbeiten, das auf die realen Vektoren

verweist %Vor%

Beispiel

    
Marco A. 12.05.2015 11:42
quelle
1

anstelle von std::vector<Wrapper> vec;

verwenden

%Vor%

Sie können Ihre Wrapper-Objekte trotzdem in vec einfügen

%Vor%

und dann bar(vec);

aufrufen     
Nagendra NR 12.05.2015 11:32
quelle
1

Out-of-the-box funktioniert das Aufrufen einer Funktion, die vector<vector<something> verwendet, nicht mit vector<Wrapper> , da ihr Typ anders ist und der Compiler explizit erstere erwartet.

Ich glaube nicht, dass diese Art der Typensubstitution in C ++ funktionieren könnte.

Abhilfe

Es gibt einen Workaround für alle Fälle: Sie könnten Conversions in Ihrem eigenen Code verwenden, um die Magie passieren zu lassen.

Lass es mich erklären.

Wenn die Funktion, die Sie verwenden wollen, ein vector<vector<something>> benötigt, müssen Sie im Grunde in ein vector<vector<something>> angeben. Sie können also Ihren Vektor nicht als vector<Wrapper> erstellen und vermeiden, ihn in ein vector<vector<something>> zu konvertieren.

Auf der anderen Seite können Sie

  1. Verwende eine vector<vector<something> , in der du Instanzen von Wrapper (mit einer impliziten Konvertierung) verschiebst.
  2. Wenn Sie Wrapper functionnality benötigen, können Sie Ihre vector<something> mithilfe eines Konvertierungskonstruktors konvertieren.

Nehmen wir das Beispiel:

%Vor%
  

P.S. Die Funktion push_back kopiert das Element. Wenn Ihre Funktion also Ihren Vektor ändert, wird sie nicht im Wrapper angezeigt, da es sich um eine Kopie des inneren Vektors handelt, der geändert wurde. Die Verwendung eines echten vector<something> und push_back würde zu demselben Verhalten führen.

    
Tiesselune 12.05.2015 11:53
quelle
0

Ok, also habe ich etwas gefunden, das zu funktionieren scheint, obwohl es noch einige Probleme geben könnte. Die Idee besteht darin, den Vektor der Vektoren in einen globalen Wrapper zu verpacken, und dann den ursprünglichen Wrapper, der auf die darin enthaltenen Daten unter Verwendung von Zeigern zugreift.

Sprich mit dem folgenden Spielzeug bar() function:

%Vor%

Die zwei Wrapper:

%Vor%

Und ein Testprogramm:

%Vor%

Noch ein Problem: Besitz von Daten. Benötigt wahrscheinlich einige intelligente Zeiger.

Laufender Code ist hier .

    
kebs 12.05.2015 13:13
quelle

Tags und Links