2008-09-17 9 views
5

Ich bin eine native C++ Klasse Verpackung, die die folgenden Methoden hat:Konvertieren von std :: vector <> :: Iterator auf .NET-Schnittstelle in C++/CLI

class Native 
{ 
    public: 
    class Local 
    { 
     std::string m_Str; 
     int m_Int; 
    }; 

    typedef std::vector<Local> LocalVec; 
    typedef LocalVec::iterator LocalIter; 

    LocalIter BeginLocals(); 
    LocalIter EndLocals(); 

    private: 
     LocalVec m_Locals; 
}; 

1) Was ist das“.NET Weg "die gleiche Art von Schnittstelle zu repräsentieren? Eine einzelne Methode, die ein Array zurückgibt <>? Hat das Array <> generische Iteratoren, so dass ich BeginLocals() und EndLocals() implementieren konnte?

2) Sollte Local als Wert Struktur in der .NET-Wrapper deklariert werden?

ich wirklich möchte die eingewickelt Klasse mit einem .NET-Geschmack repräsentieren, aber ich bin sehr neu in der verwalteten Welt - und diese Art von Informationen ist frustrierend Google für ...

Antwort

5

Iteratoren aren '' .net-Weg ', aber sie sind grob ersetzt durch IEnumerable < T> und IEnumerator < T>.

Statt

vector<int> a_vector; 
    vector<int>::iterator a_iterator; 
    for(int i= 0; i < 100; i++) 
    { 
    a_vector.push_back(i); 
    } 

    int total = 0; 
    a_iterator = a_vector.begin(); 
    while(a_iterator != a_vector.end()) { 
    total += *a_iterator; 
    a_iterator++; 
    } 

würden Sie (in C#) sehen

List<int> a_list = new List<int>(); 
for(int i=0; i < 100; i++) 
{ 
    a_list.Add(i); 
} 
int total = 0; 
foreach(int item in a_list) 
{ 
    total += item; 
} 

Oder expliziten (ohne den IEnumerator hinter dem foreach-Syntax versteckt Zucker):

List<int> a_list = new List<int>(); 
for (int i = 0; i < 100; i++) 
{ 
    a_list.Add(i); 
} 
int total = 0; 
IEnumerator<int> a_enumerator = a_list.GetEnumerator(); 
while (a_enumerator.MoveNext()) 
{ 
    total += a_enumerator.Current; 
} 

Wie Sie können sehen, foreach versteckt nur den .net-Enumerator für Sie.

Also wirklich, die ".net Weg" wäre, einfach Menschen zu erlauben, Liste < Local> Elemente für sich selbst zu erstellen. Wenn Sie die Iteration steuern oder die Sammlung etwas benutzerdefinierter gestalten möchten, implementieren Sie in Ihrer Sammlung auch die IEnumerable-Schnittstellen < T> und/oder ICollection < T>.

A in der Nähe von direkter Übersetzung C# würde so ziemlich das, was Sie angenommen:

public class Native 
{ 
    public class Local 
    { 
    public string m_str; 
    public int m_int; 
    } 

    private List<Local> m_Locals = new List<Local>(); 

    public List<Local> Locals 
    { 
    get{ return m_Locals;} 
    } 
} 

Dann wird ein Benutzer in der Lage sein würde,

foreach(Local item in someNative.Locals) 
{ 
... 
} 
0

@Phillip - Vielen Dank, Ihre Antwort hat mich wirklich begonnen in die richtige Richtung.

Nachdem Sie den Code zu sehen, und ein wenig mehr Lesung in Nish Buch tun C++/CLI in Aktion, ich denke, eine indizierte Eigenschaft verwenden, die ein const Tracking Handle auf eine lokale Instanz auf dem verwalteten Heap zurückgibt, ist wahrscheinlich die beste Ansatz. Am Ende habe ich etwas implementiert, das dem Folgenden ähnlich ist:

+0

Das ist ein guter Ansatz, aber Sie werden wahrscheinlich auch sicherstellen wollen, dass mindestens eine Count-Eigenschaft verfügbar gemacht wird :). Eine andere Anmerkung, ohne die Liste verfügbar zu machen oder IEnumerable < T > zu implementieren, wird die Klasse von den LINQ-Erweiterungen in .net 3.5 nicht verwandt werden können –