Pregunta

¿Cómo puedo revertir valor de retorno de un predicado, y retirar los elementos que el retorno falsa en lugar de verdad?

Aquí está mi código:

headerList.remove_if(FindName(name));

(por favor, ignora la falta de borrado)

FindName con un funtor 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;
    }
};

Me gustaría algo como:

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

Todavía no usando C ++ 0x, por lo lambdas no permitido, por desgracia. Estoy esperando que hay una solución mejor que escribir un funtor NotFindName.

¿Fue útil?

Solución

not1 en la cabecera <functional>:

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

Ah, y esto:

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

return false;

Por favor, no haga eso.

return ( header.Name == m_NameToFind );

Eso de más mejor, ¿verdad?

Otros consejos

Si lo prefiere puede utilizar impulso se unen por lo que no tiene que escribir esa estructura 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"));

y para remove_if_not:

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

Incluso podría usar std :: igual () para evitar la función header_has_name por completo, pero en ese momento se convierte en un poco feo.

Desafortunadamente, creo que escribir un funtor NotFindName es la mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top