Frage

Wie kann ich ein Prädikat des Reverse-Rückgabewert, und entfernen Sie die Elemente, die return false statt wahr?

Hier ist mein Code:

headerList.remove_if(FindName(name));

(bitte Mangel an Lösch ignorieren)

mit Findname ein einfaches Funktors:

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

Ich möchte so etwas wie:

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

Noch nicht mit C ++ 0x, Lambda-Ausdrücke so nicht erlaubt, traurig. Ich hoffe, es gibt eine schönere Lösung als eine NotFindName Funktors schreiben.

War es hilfreich?

Lösung

Überprüfen Sie not1 im <functional> Header:

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

Oh, und diese:

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

return false;

Bitte tun das nicht.

return ( header.Name == m_NameToFind );

Das ist viel besser, ist es nicht?

Andere Tipps

Alternativ können Sie boost binden verwenden, so dass Sie nicht, dass unary_function struct schreiben müssen:

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

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

und für remove_if_not:

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

Sie könnten sogar std :: gleich (), um die header_has_name Funktion vollständig zu vermeiden, aber an diesem Punkt wird es ein bisschen hässlich.

Leider glaube ich eine NotFindName Funktors schreibt, ist die beste Wahl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top