2
#include <functional>
#include <iostream>

struct Test
{
    void fnc(int & a) { ++a; }
};

int main ()
{
    typedef std::function<void(int)> Func;

    int i = 0;
    Test t;
    Func f = std::bind(&Test::fnc, &t, std::ref(i));
    //f(); //error C2064: term does not evaluate to a function taking 0 arguments
    f(37); //Here I am forced to pass evidently unused int
    std::cout << i;
}

私はそれを正しく使用しますか?

ランダムなintを渡す必要が本当にありますか?

もしそうなら、それはなぜですか?これは、テンプレートの魔法が限られているためであり、実際にintを関数に渡してintを取得する必要があるためですか、それとも何らかの目的で設計されているためですか?(たとえば、関数の宣言がすでにどのようになっているのかを忘れないようにユーザーに強制しますか?)

vs2012を使用します

4

2 に答える 2

5

いいえいいえいいえ:すべてがすでにバインドされているため、引数をとらない関数があります。次の2つのうちの1つが必要です。

std::function<void()> f = std::bind(&Test::fnc, &t, std::ref(i));

std::function<void(int&)> g = std::bind(&Test::fnc, &t, std::placeholders::_1);

今、次の2つの効果t.fnc(i)

f();  // OK, bound to `i` always.

g(i); // Same effect

可能であれば、バインドされた関数をとして宣言する必要があることに注意してくださいauto。これはより効率的です。そして3番目のオプションはクロージャ式です[&i,&t](){t.fnc(i);}

于 2012-08-31T21:14:23.840 に答える
1

引数を確認する必要がある場所は2つあります。bind()引数がバインドオブジェクトの一部になるtoの呼び出しと、元の場所で確立されたプレースホルダーに引数が渡されるbindオブジェクト自体の呼び出しです。を呼び出しますbind()。この例では、toの呼び出しにプレースホルダーがbind()ないため、bindオブジェクトの呼び出しに引数は必要ありません。必要以上の引数を指定して呼び出すと、余分な引数は無視されます。

ここでのコードは、バインドオブジェクトをオブジェクトでラップすることにより、バインドオブジェクトにレイヤーを追加しstd::functionます。オブジェクトに定義された署名std::function(ここでは、std::function<void(int)>)は、そのオブジェクトの呼び出し方法を決定します。型の引数を取り、intその値をバインドオブジェクトに渡します。バインドオブジェクトはそれを無視します。

于 2012-09-01T12:18:48.367 に答える