Re: C++/CLI - How to convert List<T> to vector<T>
Ben Voigt [C++ MVP] wrote:
"JohnR" <_no_spam@_no_spam.com> wrote in message
news:#1hpNBEQKHA.1268@TK2MSFTNGP04.phx.gbl...
Hi there,
I'm new to C++/CLI but very experierced in both C++ and .NET. Can
someone show me the basic syntax for converting a List<T> to vector<T>
(or more generally, any .NET generic to its C++ template equivalent).
For now I'm looking for a template with a signature similar to the
following (note however that "T" would also need to be converted
presumably so a template arg and a generic arg may be required).
Thanks in advance.
std::vector<T> marshal_as(System::Collections::Generic::List<T> ^
const & list)
Returning vector by value is going to have really bad performance unless
you have the move optimization.
For types which have dual managed/native identity (i.e. built-in numeric
types), something like:
template<typename T>
std::vector<T> marshal_as(System::Collections::Generic::ICollection<T>^
list)
{
if (list == nullptr) throw gcnew ArgumentNullException(L"list");
std::vector<T> result(list->Count);
for each (T& elem in list)
result.push_back(elem);
That's A BAD IDEA(tm). You're going to end up with the vector that has
its first list->Count elements default-initialized and the actual
meaningful elements that follow (and total of list->Count*2 elements).
Perhaps you meant
std::vector<T> result;
result.reserve(list->Count);
for each (...
Or maybe you meant
std::vector<T> result(list->Count);
for (int i = 0; ...
result[i] = list->??? ; // or use iterators
return result;
}
More generally, something like:
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(list->Count);
for each (S& elem in list)
result.push_back(marshal_as<T>(elem));
Same notes as above.
return result;
}
Not compile-tested.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask