(C ++ 14) Массив лямбд: ошибка: 'name' объявлено как массив 'auto' - PullRequest
0 голосов
/ 03 мая 2018

Я плохо понимаю эту ошибку. Признаюсь, я новичок в 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’

Из-за поиска в Google кажется, что использование auto в этом случае недопустимо в C ++ 11, но это должно быть в C ++ 14, однако я должен как-то объявить это неправильно и не могу понять.

Помощь очень ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Если вы храните лямбды в массиве только для удобства кода, а не для выбора во время выполнения, вам не нужно хранить их в массиве. Кортеж может делать то же самое:

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

Но если вы действительно хотите выбирать во время выполнения, вам придется приводить лямбда-выражения к std::function s или указателям на функции (более подробно это объясняется в другом ответе), поскольку именно так система типов C ++ работает с функциями и лямбда-выражениями ( отдельные типы, но могут быть преобразованы в соответствующие им типы функций, если они не сохраняют состояния).

0 голосов
/ 03 мая 2018

Язык 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 <functional>. Затем вы просто используете элементы массива, как и любые другие функции.

...