Question

Comment puis-je inverser la valeur de retour d'un prédicat, et supprimer les éléments faux retour au lieu de vrai?

Voici mon code:

headerList.remove_if(FindName(name));

(s'il vous plaît ignorer le manque d'effacement)

avec un FindName de foncteur simple:

struct FindName
{
    CString m_NameToFind;

    FindInspectionNames(const CString &nameToFind)
    {
        m_NameToFind = nameToFind;
    }

    bool operator()(const CHeader &header)
    {
        if(header.Name == m_NameToFind)
        {
            return true;
        }

        return false;
    }
};

Je voudrais quelque chose comme:

list.remove_if(FindName(name) == false);

Pas encore en C ++ 0x, donc lambdas pas permis, malheureusement. J'espère qu'il ya une solution plus agréable que d'écrire un foncteur NotFindName.

Était-ce utile?

La solution

Vérifier not1 dans l'en-tête <functional>:

headerList.remove_if( std::not1( FindName( name ) ) );

Oh, et ceci:

if(header.Name == m_NameToFind)
{
    return true;
}

return false;

S'il vous plaît ne pas le faire.

return ( header.Name == m_NameToFind );

beaucoup mieux, non?

Autres conseils

Sinon, vous pouvez utiliser bind boost afin que vous n'avez pas à écrire que struct unary_function:

bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;}

headerList.remove_if (boost::bind (header_has_name, _1, "name"));

et remove_if_not:

headerList.remove_if (!boost::bind (header_has_name, _1, "name"));

Vous pouvez même utiliser std :: égale () pour éviter la fonction header_has_name complètement, mais à ce moment-là, il devient un peu laid.

Malheureusement, je pense que la rédaction d'un foncteur NotFindName est votre meilleur pari.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top