我需要在C ++ / CLI中有一个函数,它在C#中使用C ++本机std::list<std::string>
和string[]
之间的链接,用我的WinForm做类似的事情:
ComboBox1.Items.AddRange(installs);
installs 是string[]
。
您如何看待这个?
Native C ++ .cpp
std::list<std::string>* Get_Liste_place_de_marche(void)
{
list<string>* liste_place_de_marche = new list<string>;
liste_place_de_marche->push_back("CAC 40");
liste_place_de_marche->push_back("DAX");
return liste_place_de_marche;
}
我需要使用最后一个代码编写此函数:
使用C#在我的Winform中调用C ++ / CLI .cpp
array<System::String^>^ NativeMethod::Get_Liste_place_de_marche(void)
{
typedef std::list<std::string>::const_iterator iter_t;
std::list<std::string> const* list = new std::list<std::string>;
list = ::Get_Liste_place_de_marche();
array<System::String^>^ ret = gcnew array<System::String^>(list->size());
int j = 0;
for (iter_t i = list->begin(); i != list->end(); ++i)
ret[j++] = gcnew System::String(i->c_str());
return ret;
}
应该有用吗?因为我有很多错误......
答案 0 :(得分:4)
以下应该做的工作:
array<System::String^>^ ArrayFromList(std::list<std::string> const& list) {
typedef std::list<std::string>::const_iterator iter_t;
array<System::String^>^ ret = gcnew array<System::String^>(list.size());
int j = 0;
for (iter_t i = list.begin(); i != list.end(); ++i)
ret[j++] = gcnew System::String(i->c_str());
return ret;
}
但是,我会尽量保持这种一般性。例如,在C ++中习惯于处理迭代器范围而不是容器。此外,以上仅适用于(零终止)字符串。转换其他对象集合将需要非常相似的代码。将对象转换抽象出来可能是有意义的。