我还有一个关于函数引用的问题。 例如,我有这样的定义:
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 调用它并传递我自己的值?
答案 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_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
没有填充向量的构造函数:< / 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);