Pergunta

Como posso reverter o valor de retorno de um predicado e remover os elementos que retornam falsos em vez de verdadeiros?

Aqui está o meu código:

headerList.remove_if(FindName(name));

(Por favor, ignore a falta de apagar)

com findname um functor simples:

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

Eu gostaria de algo como:

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

Ainda não está usando C ++ 0x, então Lambdas não é permitido, infelizmente. Espero que haja uma solução melhor do que escrever um functor NotfindName.

Foi útil?

Solução

Verificar not1 no <functional> cabeçalho:

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

Ah, e isso:

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

return false;

Por favor Não faça isso.

return ( header.Name == m_NameToFind );

Isso é Muito de Melhor, não é?

Outras dicas

Como alternativa, você pode usar o bind Boost para não precisar escrever essa estrutura 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"));

e para remover_if_not:

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

Você pode até usar o std :: igual () para evitar a função header_has_name completamente, mas nesse ponto se torna um pouco feio.

Infelizmente, acho que escrever um functor NotfindName é sua melhor aposta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top