2

基本上我想做的是:

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类似的东西delayedAddSLOT代替。

+标签功能

4

1 回答 1

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 返回类型
...
成员函数 operator() 给定从先前调用 bind 获得的对象 g,当它在函数调用表达式 g(u1, u2, ... uM) 中调用时,调用发生 std::decay::type 类型的存储对象,参数定义如下:
...
- 如果 std::is_bind_expression::value == true (即在初始调用中使用另一个绑定子表达式作为参数绑定),然后立即调用该绑定子表达式,并将其结果传递给可调用对象。如果绑定子表达式有任何占位符参数,它们是从 u1, u2, ....
... 中挑选出来的

于 2014-02-20T15:34:56.177 回答