列表和字符串转换

时间:2011-06-29 14:05:34

标签: c# c++-cli marshalling

我需要在C ++ / CLI中有一个函数,它在C#中使用C ++本机std::list<std::string>string[]之间的链接,用我的WinForm做类似的事情:

    ComboBox1.Items.AddRange(installs);

installs string[]

你知道吗?我怎样才能做到这一点?没有Intellisense,C ++ / CLI编程很难。 :(

您如何看待这个?

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;
}

应该有用吗?因为我有很多错误......

1 个答案:

答案 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 ++中习惯于处理迭代器范围而不是容器。此外,以上仅适用于(零终止)字符串。转换其他对象集合将需要非常相似的代码。将对象转换抽象出来可能是有意义的。