Transformando remover_if em remover_not_if
-
28-09-2019 - |
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.
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.