Wie bekomme ich den Werttyp von einem Ausgabe-Iterator?

8

Nehmen wir an, ich habe einen C-Container (z. B. MyContainer ) mit enthaltenen Objekten, die als void* -Zeiger gespeichert sind. Die einzige Möglichkeit, die Elemente dieses Containers zu durchlaufen, sind zwei Interface-Funktionen:

  1. getFirstElem(MyContainer const&, void*) : Gibt das erste Element des Containers aus.
  2. getNextElem(MyContainer const&, void*) : Gibt das nächste Element des Containers aus.

Ich möchte eine generische Funktion codieren, die die Elemente dieses C-Containers über die oben genannten Schnittstellenfunktionen iteriert und ihre Werte in einen C ++ - Container kopiert (z. B. std::vector ).

Was ich bisher gemacht habe:

%Vor%

Das obige Beispiel funktioniert mit normalen Iteratoren. Es kann jedoch nicht mit Ausgabe-Iteratoren kompiliert werden (z. B. copy_container(cont, std::back_inserter(myvector)); ).

Der Grund ist, dass std::iterator_traits::value_type in void resultiert, wenn der Argumenttyp ein Ausgabe-Iterator ist.

Gibt es eine Möglichkeit, diese generische Funktion auch für Ausgabe-Iteratoren zu verwenden?

Ich weiß, dass es in C ++ 11 mit decltype möglich war (zB decltype(*first) ), aber ich bin besonders an Pre-C ++ 11-Lösungen interessiert, da ich einen alten C ++ - Compiler verwende ( gcc v4.4.7).

    
101010 04.08.2014, 12:07
quelle

3 Antworten

5

Wie richtig beobachtet, ist value_type eines Ausgabe-Iterators void . Es gibt also nicht viel zu tun, außer das zu ersetzen:

%Vor%

mit diesem

%Vor%

(obwohl der Standard nicht garantiert, wird es funktionieren - ein Proxy könnte zurückgegeben werden, indem ein Ausgabe-Iterator deaktiviert wird).

Da Sie keine C ++ 11-Lösung angegeben haben, ist möglicherweise ein Redesign erforderlich. Hier sind einige Optionen:

1. Übergeben Sie den Container

Anstelle eines Iterators für das erste Element könnten Sie einen Verweis auf den Container übergeben. Es scheint, als ob alles, was Sie wollen, ist ein Push_back

%Vor%

Dann brauchen Sie nur eine Ebene von Merkmalen, die Sie zur richtigen Implementierung der Einfügung pro Container senden können

2. Übergeben Sie einen zusätzlichen Vorlagenparameter

Der Werttyp könnte ein zusätzlicher Vorlagenparameter sein

%Vor%     
Nikos Athanasiou 04.08.2014, 12:31
quelle
3

Sie können typetraits und Spezialisierung

verwenden %Vor%

Und dann wirst du Code:

%Vor%     
Jarod42 04.08.2014 12:56
quelle
0

Es gibt verschiedene Wege das zu lösen, ich habe es so gemacht:

%Vor%

Ich habe einen anderen für den üblichen Iterator.

    
Ion Todirel 01.12.2017 08:54
quelle

Tags und Links