Возможно ли элегантно преобразовать std: vector в cliext :: vector или cli :: array <T>? - PullRequest
3 голосов
/ 03 сентября 2010

Как это для броского заголовка?

Мне нужно конвертировать туда и обратно из CLR-совместимого типа, такого как массив, и типа std :: vector.

Существуют ли какие-либо методы адаптера, или я должен просто продолжать копировать их каждый раз, когда вызываю один из своих собственных методов?

Есть несколько интересных методов для преобразования между cliextВариантные классы STL и типы CLR, но я не знаю, как получить стандартный вектор в типах STL без цикла for.

Это то, что я делаю повсюду в этомпроект:

vector<double> galilVector = _galilClass->arrayUpload(marshal_as<string>(arrayName));
List<double>^ arrayList = gcnew List<double>();

// Copy out the vector into a list for export to .net
for(vector<double>::size_type i = 0; i < galilVector.size(); i++) 
{
    arrayList->Add(galilVector[i]);
}

return arrayList->ToArray();

Ответы [ 3 ]

4 голосов
/ 03 сентября 2010

Вместо того, чтобы «делать это повсюду», почему бы вам не превратить эту логику в функцию многократного использования?

Что-то вроде

template<typename T>
generic<typename S>
std::vector<T> marshal_as(System::Collections::Generic::ICollection<S>^ list)
{
  if (list == nullptr) throw gcnew ArgumentNullException(L"list");
  std::vector<T> result;
  result.reserve(list->Count);
  for each (S& elem in list)
    result.push_back(marshal_as<T>(elem));
  return result;
}

Не забудьте использовать функцию-член swap вектора, чтобы быстро переместить элементы в вектор, в который вы хотите их поместить, если вы просто назначите их, будет вызван конструктор zillion copy.

0 голосов
/ 06 марта 2015

Вы можете попробовать это:

cliext::vector<Single> vec_cliext; 
					
std::vector<float> vec_std;

cliext::vector<Single>::iterator it = vec_cliext.begin(); 
for (; it != vec_cliext.end(); ++it)
{
	float temp = *it;
	vec_std.push_back(temp);
}
0 голосов
/ 16 апреля 2012
IList<int>^ Loader::Load(int id)
{
    vector<int> items;
    m_LoaderHandle->Loader->Load(id, items);

    cliext::vector<int> ^result = gcnew cliext::vector<int>(items.size());
    cliext::copy(items.begin(), items.end(), result->begin());

    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...