cli :: array <int>для итератора в c ++ - cli - PullRequest
3 голосов
/ 01 декабря 2011

Я управлял классом с функцией:

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

В DoSomething я должен вызвать нативную функцию:

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

Какой итератор использовать?

1 Ответ

3 голосов
/ 01 декабря 2011

Вы хотите использовать закрепляющий указатель на управляемый массив. Это зафиксирует массив в памяти (то есть сделает так, чтобы сборщик мусора не мог его переместить), а затем вы можете рассматривать его как собственный массив. Ниже приведен пример использования ваших методов.

Обратите внимание, что вам нужно завершить использование массива, прежде чем указатель закрепления выйдет из области видимости - как только указатель закрепления выйдет из области видимости, управляемый массив больше не закрепляется, и сборщик мусора может свободно перемещать массив.

Также обратите внимание, что закрепление первого элемента массива приводит к закреплению всего управляемого массива (обычно использование указателя закрепления на одной части управляемого объекта приводит к закреплению всего управляемого объекта).

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...