Привязка к членской переменной

Это зависит от того, для чего Вы хотите использовать его. Типичная причина сделать так состоит в том, чтобы выполнить итерации по картам, для которых Вы просто делаете это (Java 5 +):

Map<String, Object> map = ... ; // just an example
for (Map.Entry<String, Object> entry : map.entrySet()) {
  System.out.printf("%s -> %s\n", entry.getKey(), entry.getValue());
}
7
задан navigator 21 July 2009 в 10:31
поделиться

2 ответа

За кулисами он использует указатель на член и применяет его к переданному аргументу. Это довольно сложно в контексте связывания, поэтому вот простой пример использования указателя на член:

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
}

За кулисами связывание составляет различные вызовы. Результирующий функтор принимает разыменование std :: map <> :: iterator (типа std :: pair ). Это передается внутренней привязке, который разыменовывает указатель элемента, возвращая (* it) .second внешней привязке, которая передает это значение методу print_string для окончательного вызова: print_string ((* it) .second) .

(* it) на самом деле _1 , о котором вы спрашивали. Все _ # являются заполнителями, то есть результатом связывания будет функтор, который будет принимать столько аргументов, сколько существует различных заполнителей в порядке, определяемом количеством заполнителей. В приведенном вами примере результирующий функтор принимает единственный аргумент _1 .

(* it) на самом деле _1 , о котором вы спрашивали. Все _ # являются заполнителями, то есть результатом связывания будет функтор, который будет принимать столько аргументов, сколько существует различных заполнителей в порядке, определяемом количеством заполнителей. В приведенном вами примере результирующий функтор принимает единственный аргумент _1 .

(* it) на самом деле _1 , о котором вы спрашивали. Все _ # являются заполнителями, то есть результатом связывания будет функтор, который будет принимать столько аргументов, сколько существует различных заполнителей в порядке, определяемом количеством заполнителей. В приведенном вами примере результирующий функтор принимает единственный аргумент _1 .

4
ответ дан 7 December 2019 в 10:06
поделиться
boost::bind(&std::pair<U,V>::second, _1);

функционально эквивалентен

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

, т.е. это функция (объект), которая отображает пару на ее второй член.

2
ответ дан 7 December 2019 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: