Связывание функций-членов - PullRequest
1 голос
/ 28 мая 2011

В примере в разделе функции-члена: Функции-члены Мы получили структуру X:

struct X {
  int foo(int);
};

Предпочтительный синтаксис

boost::function<int (X*, int)> f;

f = &X::foo;

X x;
f(&x, 5);

Переносимый синтаксис

boost::function2<int, X*, int> f;

f = &X::foo;

X x;
f(&x, 5);

Мои вопросы:

  • Почему я должен ставить дополнительный аргумент X *, когда мой int foo (int) принимает только один аргумент? Кроме того, это то же самое, что использование boost :: bind, например:

Персона * person = new Person ("Ту", 23);

boost :: function newFunc2 = boost :: bind (& Person :: printInfo, person);

  • В чем разница между предпочтительным синтаксисом и переносимым синтаксисом и когда использовать один над другим?
  • Что такое функциональный объект? Это указатель на функцию?

Ответы [ 2 ]

2 голосов
/ 28 мая 2011
  1. Любая функция-член имеет указатель на объект, для работы с которым неявно устанавливается в качестве первого параметра.Когда у вас есть такой код: X x; x.foo(10); компилятор действительно может вызвать для вас foo(&x, 10) (см. здесь , чтобы узнать, как это можно сделать двумя способами) - очевидно, имя foo было бы искаженонекоторым образом.

  2. См. документацию Boost для описания синтаксиса.Ниже приведена наиболее актуальная выдержка со страницы.По сути, вы должны использовать предпочтительную версию, если ваш компилятор поддерживает ее, так как она ближе всего подходит к обычному определению указателя функции (читабельность) и использует меньше аргументов шаблона (более быстрое время компиляции).

    Boost.Function имеет две синтаксические формы: предпочтительную форму и переносимую форму.Предпочтительная форма более точно соответствует языку C ++ и уменьшает количество отдельных параметров шаблона, которые необходимо учитывать, что часто улучшает читабельность;однако предпочтительная форма не поддерживается на всех платформах из-за ошибок компилятора.Совместимая форма будет работать на всех компиляторах, поддерживаемых Boost.Function.Обратитесь к таблице ниже, чтобы определить, какую синтаксическую форму использовать для вашего компилятора.

  3. A указатель функции - это простой старый указатель, который может принимать функции сконкретный тип возвращаемого значения и список аргументов. функциональный объект - это любой тип, для которого определен operator(), что позволяет вызывать его как функцию.

2 голосов
/ 28 мая 2011
  1. Вам необходимо передать объект типа X, потому что это указатель на функцию-член. Вам нужен объект, для которого вы вызываете эту функцию-член.

  2. Переносимый синтаксис предназначен для старых и новых компиляторов, и предпочтительный синтаксис не может компилироваться на старых компиляторах. Разница в деталях объясняется на странице учебника функтора

  3. объект функции - это такой объект, который вы можете вызвать как функцию. Это может быть указатель на функцию или указатель на функцию-член

...