次を使用して、関数呼び出しを延期できます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!
遅れた電話の後
あなたがしたように定義する必要もありませんfoo
。getInt
の定義で直接バインドできます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、.... から選択されます
。