2011-03-31 44 views
10

Hace poco hice una pregunta sobre la eliminación de elementos de un vector. Bueno, la solución que obtuve funciona, pero no la entiendo, y no encuentro ninguna documentación que la explique.C++ Operator() paréntesis sobrecarga

struct RemoveBlockedHost { 
    RemoveBlockedHost(const std::string& s): blockedHost(s) {} 

    // right here, I can find no documentation on overloading the() operator 
    bool operator() (HostEntry& entry) { 
     return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost; 
    } 
    const std::string& blockedHost; 
}; 

para ser utilizado como:

hosts.erase(std::remove_if(hosts.begin(), hosts.end(), RemoveBlockedHost(blockedhost)), hosts.end()); 

Miré a la documentación de std :: remove_if, se dice que es posible pasar de una clase en lugar de una función sólo cuando la clase sobrecarga el() operador. Sin información alguna.

¿Alguien sabe de enlaces a:

    • Un libro que contiene ejemplos/Explainations
      O, un enlace a la documentación en línea/tutoriales

  • Ayuda con esto sería apreciado. No me gusta agregar código a mi software a menos que lo entiendo. Sé que funciona, y estoy familiarizado (algo) con la sobrecarga del operador, pero no sé para qué sirve el operador().

    Respuesta

    11

    Se llama un funtor en C++

    Esta respuesta tiene un buen ejemplo etc

    C++ Functors - and their uses

    +0

    Muchas gracias! Tan pronto como me lo permita, aceptaré su respuesta (es decir, debo esperar 10 minutos) – FurryHead

    1

    Intente leer más sobre Functors Una clase que sobrecarga el operador Function() se llama Functor. Cualquier libro decente en C++ con explicaciones sobre STL tendrá información al respecto.
    Here es un enlace que puede consultar.

    2

    Es un functionoid, bueno en realidad un funtor. Pero las preguntas frecuentes lo explica todo:

    Functionoids son funciones en esteroides. Los Functionoids son estrictamente más potentes que las funciones, y esa energía adicional resuelve algunos (no todos) de los desafíos típicos cuando utiliza punteros de función.

    https://isocpp.org/wiki/faq/pointers-to-members#functionoids

    +0

    Esa es la primera vez que oigo el período de funcionamiento. Veo desde mi sitio favorito de hechos sesgados. ¿Alguien más tiene una referencia definitiva para este término? Un google solo encuentra enlaces de cosas que eventualmente conducen al parashift. ¿O es solo otro término de limpieza que va a causar confusión (y por lo tanto, su uso se anulará más temprano que tarde). –

    +0

    +1 Para citar las preguntas frecuentes y proporcionar un enlace. –

    0

    me gustaría señalar que después de C++ 11, se puede evitar la necesidad de algo como esto con una lambda:

    hosts.erase(std::remove_if(hosts.begin(), hosts.end(), 
        [&blockedhost](HostEntry& entry) -> bool { 
         return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost; 
        }), hosts.end());