Работа со ссылками на функции - PullRequest
0 голосов
/ 01 июня 2010

У меня есть еще один вопрос, касающийся функций. Например, у меня есть такое определение:

typedef boost::function<bool (Entity &handle)> behaviorRef;
std::map< std::string, ptr_vector<behaviorRef> > eventAssociation;

Первый вопрос: как вставить значения в такой объект карты?

Я пытался:

eventAssociation.insert(std::pair< std::string, ptr_vector<behaviorRef> >(eventType, ptr_vector<behaviorRef>(callback)));

Но ошибка:

no matching function for call to ‘boost::ptr_vector<boost::function<bool(Entity&)> >::push_back(Entity::behaviorRef&)’

И я недооцениваю это, но не могу создать работоспособный код.

Второй вопрос: как вызывать такие функции? Например, у меня есть один объект поведениеRef , как его вызвать с помощью boost :: bind с передачей моих собственных значений?

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

Первый вопрос:

ptr_vector<Foo> содержит указатели на Foo. Поэтому, если вам нужно использовать ptr_vector (возможно, из-за того, что ваши функциональные объекты слишком дороги для копирования), вы должны push_back-указатели на поведениеRef.

Второй вопрос, часть первая:

Кодекс поведения вызывается с тем же синтаксисом, что и функция bool(Entity&):

// Somehow get an Entity and a behaviorRef
Entity some_entity = ...;
behaviorRef some_behavior = ...;

// Call the behaviorRef
bool result = some_behavior(some_entity);

Второй вопрос, часть вторая:

Поведениеантности можно использовать с boost :: bind так же, как с другим функциональным объектом:

// Somehow get an Entity and a behaviorRef
Entity some_entity = ...;
behaviorRef some_behavior = ...;

// Make a new function object, bound to some_entity
boost::function<bool()> bound_behavior = boost::bind(some_behavior, some_entity);

// Call the bound function.
bool result = bound_behavior();
2 голосов
/ 01 июня 2010

ЧАСТЬ 1

Нет необходимости использовать ptr_vector. boost::function имеет семантику значений, поэтому может храниться в стандартном контейнере. Поэтому должно работать следующее:

typedef boost::function<bool (Entity &handle)> behaviorRef;
std::map< std::string, std::vector<behaviorRef> > eventAssociation;

eventAssociation.insert(std::make_pair(eventType, vector<behaviorRef>(1, callback)));

Обратите внимание на два аргумента конструктора vector.

Если вам нужен ptr_vector (потому что вы использовали некопируемый тип), вам понадобится что-то вроде следующего, так как ptr_vector не имеет конструктора, который заполняет вектор:

ptr_vector<behaviorRef> behaviours;
behaviours.push_back(new behaviourRef(callback));
eventAssociation.insert(std::make_pair(eventType, behaviours));

ЧАСТЬ 2

Нет необходимости использовать boost::bind для вызова функции (хотя вы можете использовать ее, чтобы сделать это в первую очередь). Синтаксис для его вызова такой же, как и для обычной функции:

behaviourRef behaviour;
Entity entity;
bool result = behaviour(entity);
...