Как повысить :: bind вызов частных методов? - PullRequest
19 голосов
/ 30 июня 2011

boost :: bind чрезвычайно удобен в ряде ситуаций.Одним из них является отправка / публикация вызова метода, чтобы io_service сделал вызов позже, когда это возможно.

В таких ситуациях boost :: bind ведет себя так, как можно было бы искренне ожидать:1004 *

Однако, насколько мне известно, boost создает функтор (класс с оператором () ()), способный вызывать данный метод для данного объекта.Должен ли этот класс иметь доступ к закрытому B?Наверное, нет.

Что мне здесь не хватает?

Ответы [ 2 ]

36 голосов
/ 30 июня 2011

Вы можете вызывать любую функцию-член через указатель на функцию-член, независимо от ее доступности. Если функция приватная, то только члены и друзья могут создать указатель на нее, но любой может использовать указатель после создания.

8 голосов
/ 30 июня 2011

Через функцию указатель на член, boost вызывает частные функции. Функция-член класса создает указатель и передает его в boost, а затем boost использует этот указатель для вызова закрытой функции объекта класса.

Вот одна простая иллюстрация этой основной идеи:

class A;

typedef void (A::*pf)();

class A 
{
public:     
    pf get_ptr() { return &A::B; } //member function creates the pointer
private:    
    void B() { cout << "called private function" << endl; }
};

int main() {
        A a;
        pf f = a.get_ptr();
        (a.*f)();
        return 0;
}

Выход:

называется частной функцией

Хотя он не использует повышение, но основная идея именно в этом.

Обратите внимание, что только функции-члены и friend могут создавать указатель на private функцию-член. Другие не могут его создать.

Демонстрация на ideone: http://ideone.com/14eUh

...