使用函数引用

时间:2010-06-01 13:18:19

标签: c++ function boost reference bind

我还有一个关于函数引用的问题。 例如,我有这样的定义:

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&)’

我对此不以为然,但无法制作可行的代码。

第二个问题是如何调用这些函数? 例如,我有一个 behaviorRef 的对象,如何使用 boost :: bind 调用它并传递我自己的值?

2 个答案:

答案 0 :(得分:3)

第一个问题:

ptr_vector<Foo>包含指向Foo的指针。因此,如果您需要使用ptr_vector(可能因为您的函数对象复制起来很昂贵),您必须将指针推送到behaviorRef。

第二个问题,第一部分:

使用与bool(Entity&)函数相同的语法调用behaviorRef:

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

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

第二个问题,第二部分:

behaviorRef可以与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();

答案 1 :(得分:2)

第1部分

无需使用ptr_vectorboost::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没有填充向量的构造函数:< / p>

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);