2009-07-21 9 views
7

No estoy seguro de qué impulso :: bind hace cuando nos vinculamos a variables miembro. Con el enlace a la función de miembro, básicamente creamos un objeto de función, y luego lo llamamos pasando los argumentos que se proporcionan o se retrasan y se sustituyen por marcadores de posición.Encuadernación a una variable miembro

Pero lo que hace esta expresión no detrás de las escenas:

boost::bind(&std::pair::second, _1); 

Lo que se sustituidos en lugar del marcador de posición _1?

yo encontramos este leyendo este ejemplo de un artículo sobre boost :: bind mientras:

void print_string(const std::string& s) { 
    std::cout << s << '\n'; 
} 

std::map<int,std::string> my_map; 
my_map[0]="Boost"; 
my_map[1]="Bind"; 

std::for_each(
    my_map.begin(), 
    my_map.end(), 
    boost::bind(&print_string, boost::bind(
     &std::map<int,std::string>::value_type::second,_1))); 

source

Respuesta

4

Detrás de las escenas que está utilizando un puntero miembro y su aplicación a la aprobada en argumento. Es bastante complejo en el contexto de la liga, por lo que aquí es un simple ejemplo de uso de puntero a miembro:

int main() 
{ 
    std::pair< int, int > p1 = make_pair(1, 2); 
    std::pair< int, int > p2 = make_pair(2, 4); 
    int std::pair<int,int>::*ptr = &std::pair<int,int>::second; // pointer to second member 

    std::cout << p1.*ptr << std::endl; // 2 dereference pointer to member 
    std::cout << p2.*ptr << std::endl; // 4 dereference pointer to member 
} 

Detrás de las escenas BIND es componer diferentes llamadas. El functor resultante toma la desreferencia de std :: map <> :: iterator (de tipo std :: par < const tipo_clave, tipo_valor>). Esto se pasa al enlace interno, que desreferencia el puntero de miembro, devolviendo así (*it).second al enlace externo que pasa ese valor al método print_string para la llamada final: print_string((*it).second).

(*it) es en realidad el _1 que ha preguntado. Todos los _# son marcadores de posición, es decir, el resultado de bind será un funtor que tomará tantos argumentos como diferentes marcadores de posición existan en el orden definido por el número de marcador de posición. En el ejemplo que proporcionó, el functor resultante toma un solo argumento _1.

2
boost::bind(&std::pair<U,V>::second, _1); 

es funcionalmente equivalente a

std::pair<U,V> p -> p.second 

es decir. es una función (objeto) que mapea un pair<U,V> en su miembro second.

Cuestiones relacionadas