【问题标题】:(C++14) Array of lambdas: error: 'name' declared as array of 'auto'(C++14) lambda 数组:错误:'name' 声明为 'auto' 数组
【发布时间】:2018-05-03 04:23:34
【问题描述】:

我很难弄清楚这个错误。我承认,我是 C++ 新手,我的困难来自于不理解错误信息。

代码如下:

auto selectionFuncs[8] =
{
    [&](const Vector3& min, const Vector3& max) 
    { 
      return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_;
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.y_ == seamValues.y_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.y_ == seamValues.y_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.y_ == seamValues.y_ && min.z_ == seamValues.z_; 
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_ && min.y_ == seamValues.y_ && min.z_ == seamValues.z_; 
    }
};

这是错误:

error: ‘selectionFuncs’ declared as array of ‘auto’

通过谷歌搜索,在这种情况下使用 auto 似乎在 C++11 中是不允许的,但它应该在 C++14 中,但是我必须以某种方式声明它是错误的并且无法弄清楚。

非常感谢您的帮助,谢谢!

【问题讨论】:

  • 不能用auto声明数组,就这么简单。使用 std::function 的数组来存储 lambda。
  • @DeiDei 有什么我可以查看的示例在这种情况下会有所帮助吗?你能尽可能地显示语法吗?同时我会谷歌!感谢您的帮助。
  • 很确定每个 lambda 的类型与任何其他 lambda 的类型无关(它们都是用于在每次需要特定 lambda 时创建唯一函子实例的语法糖),即使它们表面上看起来相同(原型等),所以是的,需要像 std::function 这样的包装器。

标签: c++ arrays lambda c++14


【解决方案1】:

C++ 语言禁止使用auto 声明数组。您有两个不错的选择:函数指针,甚至更好 - std::function。像这样的:

std::function<bool(const Vector3&, const Vector3&)> selectionFuncs[8] =
{
    [&](const Vector3& min, const Vector3& max) 
    { 
      return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_;
    },

    [&](const Vector3& min, const Vector3& max) 
    { 
      return min.x_ == seamValues.x_; 
    },

    // ...
};

别忘了#include &lt;functional&gt;。然后,您只需像使用任何其他函数一样使用数组的元素。

【讨论】:

  • 我明白了。我需要阅读更多内容以了解所有内容。我很好奇为什么模板中有bool类型。
  • bool 是您封装的 lambda 的返回类型。
  • 哦!这很有意义。感谢您的快速帮助!
【解决方案2】:

如果您只是为了代码方便而不是为了运行时选择而将 lambdas 存储在数组中,则不必将它们存储在数组中。一个元组可以做同样的事情:

auto selectionFuncs = std::make_tuple(
    [&](const Vector3& min, const Vector3& max) 
    { 
      return max.x_ == seamValues.x_ || max.y_ == seamValues.y_ || max.z_ == seamValues.z_;
    },
    //...

但是,如果您确实想要运行时选择,则必须将 lambdas 转换为 std::functions 或函数指针(在另一个答案中进一步解释),因为这就是 C++ 类型系统如何与函数和 lambdas 一起工作(Lambdas 是不同的类型,但如果它们是无状态的,则可以转换为它们各自的函数类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2019-08-15
    相关资源
    最近更新 更多