2

基本的に私がやりたいことはこれです:

std::function< int( void ) > foo = &getInt;
int magicNumber = 13;
std::function< int( void ) > delayedAdd = std::bind( std::plus, magicNumber, getInt );

明らかにこれはうまくいきません。関数が発生する直前に発生するように、何らかの方法でgetInt 呼び出しをラップする必要があります。std::plusその後、私が電話するまですべてを遅らせる必要がありますdelayedAdd

QObject の外で Qt5.0 を使用しているためconnect、ラムダをSLOT. しかし、代わりにのconnectようなものが欲しいです。delayedAddSLOT

+タグ機能

4

1 に答える 1

4

次を使用して、関数呼び出しを延期できますstd::bind

using namespace std;

int getInt() {
    cout << "getInt!" << endl;
    return 42;
}

function<int(void)> foo = &getInt;
int magicNumber = 13;

cout << "before delayed definition" << endl;
function<int(void)> delayed = std::bind(plus<int>(), magicNumber, bind(foo));
cout << "after delayed definition" << endl;

int i = delayed();

cout << "after delayed call" << endl;

出力:

遅延定義前 遅延定義

getInt!
遅れた電話の後

あなたがしたように定義する必要もありませんfoogetIntの定義で直接バインドできますdelayed

function<int(void)> delayed = bind(plus<int>(), magicNumber, bind(getInt));

std::bind の詳細については、N3797 の段落 20.9.9 を確認してください
より具体的な説明については、cppreferenceは次のように述べています。

std::bind 戻り値の型
...
メンバー関数 operator() bind の以前の呼び出しから取得されたオブジェクト g が与えられた場合、それが関数呼び出し式 g(u1, u2, ... uM) で呼び出されると、次の呼び出しstd::decay::type 型の格納されたオブジェクトが発生し、引数は次のように定義されます:
...
- std::is_bind_expression::value == true の場合 (つまり、最初の呼び出しで別のバインド部分式が引数として使用された場合)バインドする)、そのバインド部分式がすぐに呼び出され、その結果が呼び出し可能なオブジェクトに渡されます。バインド部分式にプレースホルダー引数がある場合、それらは u1、u2、.... から選択されます

于 2014-02-20T15:34:56.177 に答える