std :: bind如何增加传递给函数的参数数量?

时间:2016-08-06 21:45:56

标签: c++ c++11 stdbind

我正在读一本书,下面是代码:

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的任何其他信息,将不胜感激。

1 个答案:

答案 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,因此会被忽略。