2016-08-06 3 views
1

私は本を読んでいて、コードの下にあります:std :: bindが関数に渡される引数の数を増やす方法は?

mActionBinding[Fire].action = derivedAction<Aircraft>(
std::bind(&Aircraft::fire, _1)); 

派生アクションに送られる引数は、2た引数後に送信されます。

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

火災の宣言は、航空機のクラスにあるこのです:私はSTD ::バインドに関するいくつかの記事を読んだ

class Aircraft:public SceneNode 
{ 
public: 
    void fire() 
}; 

、正直なところ、私はthis.thisようなものがある見ていませんはるかに複雑です。

私の質問をソートしてみましょう:

私の読書に1をベースに、このSTD ::バインドは3つの引数を持っています!メンバー関数、暗黙のクラス名、および_1。それは本当ですか?これは、static_cast<gameObject &>(node)の代わりにderivedActionで呼び出すと、「this」が送られることを意味しますか?

2-fireには引数がまったくありません(暗黙的なものを除いて)、なぜ_1はエラーが発生しませんか?どのように "dt"が送信されるのでしょうか?

私はちょっと混乱しています、参考文献には簡単な使用例があり、他の情報はstd::bindです。

+0

@AmiTavoryあなたのコメントがありませんでした。あなたはどういう意味ですか? – shayan

+0

'bind'されたメンバ関数の最初の引数は、それが呼び出されるインスタンスです、別名' 'impicit this" _ –

+0

@Revolver_Ocelot OK、それに対してパラメータはないが、jtは受け入れますか? – shayan

答えて

4
std::bind(&Aircraft::fire, _1) 

1)std::bindには2つの引数が渡されます。最初の引数は&Aircraft::fireであり、メンバ関数Aircraft::fireへのポインタです。 2番目の引数はstd::placeholders::_1であり、using namespace std::placeholdersが存在するため、非修飾ルックアップによって検出されます。

fn(static_cast<GameObject &>(node), dt) 

2)_1プレースホルダを置き換えstatic_cast<GameObject &>(node)引数。 Aircraft::fireには1つのパラメータがあり、暗黙のthisであるので、static_cast<GameObject &>(node)は暗黙のthis引数としてAircraft::fireに供給されます。引き数dtは、_2プレースホルダーを置き換えますが、_2がないため、無視されます。

関連する問題