延迟函数调用中的延迟函数调用

Delayed Function Call in a Delayed Function Call

本文关键字:延迟 函数调用      更新时间:2023-10-16

基本上我想做的是:

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,所以我不能将lambdaconnect转换为SLOT。但我想把connect类似于delayedAdd的东西改为SLOT

+标签功能

您可以使用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。您可以在delayed:的定义中直接绑定getInt

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

有关std::bind的更多详细信息,请查看N3797,第20.9.9段。
有关更具体的解释,cppreference说:

std::绑定返回类型

成员函数运算符()给定从早期绑定调用中获得的对象g,当它在函数调用表达式g(u1,u2,…uM)中被调用时,将调用std::decay::type类型的存储对象,参数定义如下:

-如果std::is_bind_expression::value==true(即在绑定的初始调用中使用了另一个绑定子表达式作为参数),则会立即调用该绑定子表达式,并将其结果传递给可调用对象。如果绑定子表达式有任何占位符参数,则从u1、u2、…中选取
。。。