C ++ std :: find lambda表达式

时间:2013-05-28 02:15:25

标签: c++ c++11 lambda find expression

对于我的生活,我无法使用此代码。我试图在XNA框架的弃用之后将我的代码从C#转换为C ++,但是一个顽固的方法不希望被转换。在C#中它是:

public Tile GetTileAtPosition(bool screenOrGame, Vector2 position)
    {

        if (screenOrGame)
        {
            return Array.Find(tileList, tile => tile.Position == position / 24);
        }
        else
        {
            return Array.Find(tileList, tile => tile.Position == position);
        }
    }

在C ++中,我试图使用的代码代替:

Tile Level::GetTileAtPosition(bool screenOrGame, sf::Vector2f position)
{
    vector<Tile>::iterator it;

    if (screenOrGame)
    {

        it = find(tileList.begin(), tileList.end(), [position](const Tile &t) { return t.GetPosition() == sf::Vector2f(position.x / 24, position.y / 24); });
        return Tile(it->GetID(), it->GetPosition().x, it->GetPosition().y);

    }

    else
    {

        it = find(tileList.begin(), tileList.end(), [position](const Tile& t) { return t.GetPosition() == position; });
        return Tile(it->GetID(), it->GetPosition().x, it->GetPosition().y);

    }

}

在C ++分配行(it = ...)上,我遇到了一个难以理解的错误,我无法弄清楚原因或解决方法。它返回:

error C2679: binary '==' : no operator found which takes a right-hand operand of type 'const Blobby::Level::GetTileAtPosition::<lambda_29eb981cd341d9c05d39c4654bc470b9>' (or there is no acceptable conversion)    c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 3186

有没有办法解决这个错误,或者用C ++实现该方法的更好/更实用的方法?

1 个答案:

答案 0 :(得分:14)

在C ++中,采用比较器的版本有时以_if为后缀。这是std::find的情况。 std::find需要一个元素来查找,而std::find_if需要一个实现相等的比较器。该错误只是意味着找不到匹配Tile等同于lambda的匹配。