首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++-cli中迭代器的cli::array<int>

c++-cli中迭代器的cli::array<int>
EN

Stack Overflow用户
提问于 2011-12-01 18:29:28
回答 1查看 1.2K关注 0票数 3

我已经用函数托管了类:

代码语言:javascript
复制
int DoSomething(cli::array<int>^ values) { .. }

在DoSomething中,我必须调用本机函数:

代码语言:javascript
复制
template <class It>
int Calculate(It beg, It end) {..}

使用哪个迭代器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-01 21:51:54

您将希望使用指向托管数组的固定指针。这将在内存中修复数组(即使其不能被垃圾收集器移动),然后您可以将其视为本机数组。下面是使用您的方法的示例。

请注意,您需要在锁定指针超出作用域之前完成数组的使用--一旦锁定指针超出作用域,托管数组就不再被锁定,垃圾回收器可以自由移动该数组。

还要注意,固定数组的第一个元素会导致整个托管数组被钉住(通常,在托管对象的一部分上使用钉住指针会导致整个托管对象被钉住)。

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8339836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档