一千萬個為什麽

搜索

cli :: array <int>到c ++中的叠代器 - cli

我有托管類功能:

int DoSomething(cli::array^ values) { .. }

在DoSomething中我必須調用本機函數:

template 
int Calculate(It beg, It end) {..}

使用哪個叠代器?

最佳答案

您將需要使用指向托管陣列的固定指針。這將修復內存中的數組(即使垃圾收集器無法移動它),然後您可以將其視為本機數組。以下是使用您的方法的示例。

請註意,在釘紮指針超出範圍之前需要完成使用數組 - 一旦釘紮指針超出範圍,托管陣列就不再固定,垃圾收集器可以自由移動陣列。

另外,請註意,固定數組的第一個元素會導致整個托管數組被固定(通常使用托管對象的一部分上的固定指針會導致整個托管對象被固定)。

template  int Calculate(It beg, It end) 
{
    int sum = 0;
    for (; beg != end; ++beg)
    {
        int i = *beg;
        sum += i;
    }

    return sum;
} 

int DoSomething(cli::array^ values)
{
    int numValues = values->Length;
    pin_ptr pNativeValuesBegin = &values[0];
    int * pBegin = pNativeValuesBegin;
    int * pEnd = pBegin + numValues;
    return Calculate(pBegin, pEnd);
} 

int main(array ^args)
{
    array ^ values = gcnew array { 1, 2, 3, 4, 5 };
    int sum = DoSomething(values);

    System::Console::WriteLine(sum);
    return 0;
}

轉載註明原文: cli :: array <int>到c ++中的叠代器 - cli