повысить привязку к поведению обратного вызова члена данных - PullRequest
1 голос
/ 24 марта 2011

Может кто-нибудь объяснить этот кусок кода?

struct Class {
    boost::function<void()> member;
};
Class c;

boost::function<boost::function<void()>()> foo = boost::bind(&Class::member, &c);
boost::function<void()> bar = boost::bind(&Class::member, &c);

Почему определение bar компилируется и каков его результат?

Редактировать: foo() работаеткак и ожидалось, звонит c.member(), но bar() нет.

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Первый вызов используется для «генерации» функтора экстрактора.Этот функтор при вызове вернет элемент, с которым он был связан.

Второй вызов просто скрывает возвращаемый тип функтора (который такой же, как в первом примере).По сути, вызов bar ничего не сделает.

0 голосов
/ 24 марта 2011

Вы должны были бы связать, если бы ваш класс был таким:

class Class { public: void member(); };

Тогда то, что вы хотите сделать, это:

Class c;

boost::function<void()> the_function_i_want_to_call = boost::bind(&Class::member, c);

the_function_i_want_to_call.call();

...