我有一个功能管理类:
int DoSomething(cli::array<int>^ values) { .. }
在DoSomething中我必须调用本机函数:
template <class It>
int Calculate(It beg, It end) {..}
使用哪个迭代器?
答案 0 :(得分:3)
您需要使用指向托管数组的固定指针。这将修复内存中的数组(即使垃圾收集器无法移动它),然后您可以将其视为本机数组。以下是使用您的方法的示例。
请注意,在钉扎指针超出范围之前需要完成使用数组 - 一旦钉扎指针超出范围,托管阵列就不再固定,垃圾收集器可以自由移动阵列。
另外,请注意,固定数组的第一个元素会导致整个托管数组被固定(通常使用托管对象的一部分上的固定指针会导致整个托管对象被固定)。
template <class It> int Calculate(It beg, It end)
{
int sum = 0;
for (; beg != end; ++beg)
{
int i = *beg;
sum += i;
}
return sum;
}
int DoSomething(cli::array<int>^ values)
{
int numValues = values->Length;
pin_ptr<int> pNativeValuesBegin = &values[0];
int * pBegin = pNativeValuesBegin;
int * pEnd = pBegin + numValues;
return Calculate(pBegin, pEnd);
}
int main(array<System::String ^> ^args)
{
array<int> ^ values = gcnew array<int> { 1, 2, 3, 4, 5 };
int sum = DoSomething(values);
System::Console::WriteLine(sum);
return 0;
}