【问题标题】:Delayed Function Call in a Delayed Function Call延迟函数调用中的延迟函数调用
【发布时间】:2014-02-20 15:15:06
【问题描述】:

基本上我想做的是这样的:

std::function< int( void ) > foo = &getInt;
int magicNumber = 13;
std::function< int( void ) > delayedAdd = std::bind( std::plus, magicNumber, getInt );

显然这行不通。我需要以某种方式包装 getInt call 以便它在 std::plus 函数发生之前发生。那么这一切都需要推迟到我打电话给delayedAdd

我在 QObject 之外使用 Qt5.0,所以我不能将 connect lambda 转换为 SLOT。但我想将connect 类似于delayedAdd 改为SLOT

+标签功能

【问题讨论】:

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


    【解决方案1】:

    您可以使用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;
    

    输出:

    延迟定义之前
    延迟定义后
    获取整数!
    延迟通话后

    您也不需要像以前那样定义foo。你可以直接在delayed的定义中绑定getInt

    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 (即在对 bind 的初始调用中使用另一个绑定子表达式作为参数),则立即调用该绑定子表达式并将其结果传递给可调用对象。如果绑定子表达式有任何占位符参数,则从 u1、u2、...中挑选它们。
    ...

    【讨论】:

    • 牛逼!刚刚发生了什么? bind返回plus是什么类型?我以为 bind 返回了一个函数对象!
    • 有些事情,你只是不想知道;)
    • 更严重的是,stackoverflow.com/questions/6412065/… 触及这个问题,但没有提供很多细节
    • 所以我是否正确理解外部绑定在这里进行转换,所以加号函数只能看到两个整数?
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多