您可以使用以下方法推迟函数调用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, ....
... 中挑选出来的