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

时间:2014-02-20 15:15:07

标签: c++ function-pointers delayed-execution stdbind

基本上我想做的是:

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 lambda到SLOT。但我希望connect代替delayedAdd代替SLOT

+ tag funception

1 个答案:

答案 0 :(得分: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!
  延迟通话后

您也不需要像过去那样定义foo。您可以直接在getInt

的定义中绑定delayed
function<int(void)> delayed = bind(plus<int>(), magicNumber, bind(getInt));

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

  

std :: bind返回类型
  ...
  成员函数运算符()   给定从先前调用bind获得的对象g,当在函数调用表达式g(u1,u2,... uM)中调用它时,会调用std :: decay :: type类型的存储对象,参数定义如下:
  ...
   - 如果std :: is_bind_expression :: value == true(即在初始调用bind时将另一个绑定子表达式用作参数),则立即调用该绑定子表达式,并将其结果传递给可调用对象。如果bind子表达式有任何占位符参数,则从u1,u2,....中选择它们   ......