在C++/CLI中将std :: vector <> :: iterator转换为.NET接口

Bri*_*art 5 .net arrays c++-cli vector marshalling

我正在包装一个本机C++类,它具有以下方法:

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;
};
Run Code Online (Sandbox Code Playgroud)

1)表示同一种界面的".NET方式"是什么?返回数组<>的单个方法?数组<>泛型是否有迭代器,以便我可以实现BeginLocals()和EndLocals()?

2)在.NET包装器中是否应将Local声明为值结构

我真的很想代表带有.NET风格的包装类,但我对托管世界并不陌生 - 这种类型的信息令谷歌感到沮丧......

Phi*_*eck 5

迭代器不能完全转换为".net方式",但它们大致被IEnumerable <T>和IEnumerator <T>取代.

而不是

  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++;
  }
Run Code Online (Sandbox Code Playgroud)

你会看到(在c#中)

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;
}
Run Code Online (Sandbox Code Playgroud)

或者更明确地(没有隐藏在foreach语法糖背后的IEnumerator):

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;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,foreach只为您隐藏.net枚举器.

实际上,".net方式"就是简单地允许人们为自己创建List <Local>项目.如果您确实希望控制迭代或使集合更加自定义,那么让您的集合实现IEnumerable <T>和/或ICollection <T>接口.

对c#的近乎直接的翻译几乎就是你所假设的:

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;}
  }
}
Run Code Online (Sandbox Code Playgroud)

然后用户就可以了

foreach( Local item in someNative.Locals)  
{
 ... 
}
Run Code Online (Sandbox Code Playgroud)