我正在读一本书,下面是代码:
mActionBinding[Fire].action = derivedAction<Aircraft>(
std::bind(&Aircraft::fire, _1));
发送给派生动作的参数将在稍后发送两个争论。
template<typename GameObject, typename Function>derived action function
std::function<void(SceneNode&, sf::Time)> derivedAction(Function fn)
{
return [=](SceneNode& node, sf::Time dt) expression
{
assert(dynamic_cast<GameObject *>(&node) != nullptr);
fn(static_cast<GameObject &>(node), dt);
};
}
火灾声明属于飞机类:
class Aircraft:public SceneNode
{
public:
void fire()
};
我已经阅读了一些关于std :: bind的文章,但说实话,我还没有见过这样的东西。这个要复杂得多。
让我对我的问题进行排序:
1 - 基于我的阅读,这个std :: bind有三个参数!成员函数,隐式类名和_1。这是真的吗?这是否意味着,当我们在derivedAction中调用它而不是static_cast<gameObject &>(node)
时,“this”会被发送给它吗?
2-fire完全没有参数!(除了暗示这一点),为什么_1给我们没有错误?以及如何将“dt”发送给它?
我有点困惑,参考文献给出了简单用法的例子,关于std::bind
的任何其他信息,将不胜感激。
答案 0 :(得分:4)
std::bind(&Aircraft::fire, _1)
1)有两个参数传递给std::bind
。第一个参数是&Aircraft::fire
,指向成员函数Aircraft::fire
的指针。第二个参数是std::placeholders::_1
,由于在某处存在using namespace std::placeholders
而由非限定查找找到。
fn(static_cast<GameObject &>(node), dt)
2)参数static_cast<GameObject &>(node)
取代_1
占位符。 Aircraft::fire
有一个参数,即隐式this
,因此static_cast<GameObject &>(node)
作为this
的隐式Aircraft::fire
参数提供。参数dt
将替换_2
占位符,但由于没有_2
,因此会被忽略。