Je veux comparer mes fonctions de classe "WorldChunk" "getX ()" et "getY ()" avec "chunk_x" et "chunk_y" passées à la fonction, mais je ne veux pas créer une nouvelle instance de "WorldChunk" pour comparer avec .

J'ai essayé quelque chose comme ça mais ça ne marche pas.

int ChunkGrid::unload_chunk(unsigned int chunk_x, unsigned int chunk_y)
{
    auto chunk = std::lower_bound(loaded_chunks.begin(), loaded_chunks.end(), NULL, 
        [chunk_x, chunk_y](const WorldChunk& ch, const auto * null)                                     
        {
            return (ch.getX() == chunk_x && ch.getY() == chunk_y) ? true : false;
        });;

//rest of the function

}

Journal des erreurs:

Error   C2672   'operator __surrogate_func': no matching overloaded function found.

Error   C2784   'auto ChunkGrid::unload_chunk::<lambda_d0b216222e2c66d42cf1e3316f6d68ac>::operator ()(const WorldChunk &,const _T1 *) const': could not deduce template argument for 'const _T1 *' from 'const _Ty' 
1
Zmiennocieplny 3 nov. 2019 à 18:52

1 réponse

Meilleure réponse

Le problème que vous rencontrez est que vous essayez de transmettre la valeur de comparaison via la capture lambda plutôt que via les paramètres. Faites-le correctement; il n'est pas nécessaire que le type du troisième paramètre soit du même type que le value_type des itérateurs:

int ChunkGrid::unload_chunk(vec2<unsigned int> chunk_loc)
{
    auto chunk = std::lower_bound(loaded_chunks.begin(), loaded_chunks.end(), chunk_loc, 
        [](const WorldChunk& ch, const vec2<unsigned int> &loc)                                     
        {
            return (ch.getX() < loc.x && ch.getY() < loc.y) ? true : false;
        });;

//rest of the function

}

Votre vrai problème ici est que lower_bound n'est pas une fonction de recherche générique (c'est std::find). Il nécessite que la séquence loaded_chunk soit triée (ou au moins partitionnée par rapport à la valeur de test) par rapport à la fonction de recherche. Autrement dit, tous les éléments pour lesquels la comparaison avec la valeur sera vraie doivent venir avant tous les éléments pour lesquels la comparaison avec la valeur sera fausse. Donc, à moins que vous n'ayez trié cette liste de morceaux par position X / Y (avec cet ordre exact; X

1
Nicol Bolas 3 nov. 2019 à 16:03