基本上我想做的是:
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
答案 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,....中选择它们 ......