C#lambda函数含义和C ++转换

时间:2013-06-25 14:57:53

标签: c# c++ lambda

我正在尝试将C#转换为C ++,这是我在Internet上找到的图像的过滤函数,因此我可以编译DLL并在我的项目中使用它。 原始的C#代码是:

    Parallel.For(0, height, depthArrayRowIndex => {
        for (int depthArrayColumnIndex = 0; depthArrayColumnIndex < width; depthArrayColumnIndex++) {
            var depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);
            .
            .
            .
            ... other stuff ...
    }

我的问题的第一部分是:如何

    depthArrayRowIndex => {

的作品? depthArrayRowIndex的含义是什么:

    var depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);

这是我的C ++翻译:

    concurrency::parallel_for(0, width, [&widthBound, &heightBound, &smoothDepthArray] () {
        for (int depthArrayColumnIndex = 0; depthArrayColumnIndex < width; depthArrayColumnIndex++) {
            int depthIndex = depthArrayColumnIndex + (depthArrayRowIndex * width);
            .
            .
            .
            ... other stuff ...
    }

但显然depthArrayRowIndex没有任何意义。 如何在C ++中使用C#代码翻译C#代码?

非常感谢!!! : - )

3 个答案:

答案 0 :(得分:3)

在这种情况下,“depthArrayRowIndex”是lambda函数的输入参数,因此在C ++版本中,您可能想要更改

[&widthBound, &heightBound, &smoothDepthArray] () 

代表

[&widthBound, &heightBound, &smoothDepthArray] (int depthArrayRowIndex)

如果您想进一步阅读有关C#lambda语法的信息,可以使用此链接

http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx

答案 1 :(得分:1)

Foo => {
  // code
  return bar; // bar is of type Bar
}

相同
(Foo) => {
  // code
  return bar; // bar is of type Bar
}

将其转换为C ++做

[&](int Foo)->Bar {
  // code
  return bar; // bar is of type Bar
}

确认Foo的类型为int。在C ++中,单行lambda可以跳过->Bar部分。不返回任何内容的Lambda可以跳过->void

您可以在C ++ lambda的[]内列出捕获的参数(如果它们是通过值或引用捕获的),但C#lambdas相当于捕获智能引用隐式使用的所有内容。如果lambda的生命周期限于创建C ++ lambda的范围,[&]是等效的。

如果它可以持续更长时间,你需要处理lambda捕获的数据的生命周期管理,并且你需要更加小心并且只能按值捕获(并且可能将数据打包到{{1}在捕获shared_ptr)之前。

答案 2 :(得分:0)

depthArrayRowIndex基本上是你的(并行)外部for循环的索引变量/值。它将从0包含到height独占:

http://msdn.microsoft.com/en-us/library/dd783539.aspx

一个小解释(C#):parallel for的第三个参数是lambda函数,action获取一个Int32参数,它恰好是循环索引。

所以我认为你的C ++翻译应该从以下开始: concurrency::parallel_for(0, height, ...代替width