(C++ 14)lambdas数组:错误:'name'声明为'auto'数组

Jus*_*avy 4 c++ arrays lambda c++14

我很难搞清楚这个错误.我承认,我是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_; 
    }
};
Run Code Online (Sandbox Code Playgroud)

这是错误:

error: ‘selectionFuncs’ declared as array of ‘auto’
Run Code Online (Sandbox Code Playgroud)

从谷歌搜索,似乎在这个实例中使用auto是不允许在C++ 11中但它应该在C++ 14中,但是我必须以某种方式宣布它是错误的并且无法解决它.

非常感谢帮助,谢谢!

Dei*_*Dei 6

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_; 
    },

    // ...
};
Run Code Online (Sandbox Code Playgroud)

别忘了#include <functional>.然后你就像使用任何其他函数一样使用数组的元素.

  • `bool`是封装lambda的返回类型. (2认同)

N00*_*dge 5

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

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

但是,如果你真的想运行时的选择,你将不得不投的lambda表达式,以std::functionS或函数指针(在对方的回答进一步解释),因为这是C++的类型系统如何与函数和lambda表达式(lambda表达式是不同的类型,但可以投如果他们是无国籍的话,他们各自的功能类型.