如何在std :: bind中使用占位符

时间:2019-07-05 15:15:02

标签: c++11 c++14

我给您一个简单的代码段:

#include <functional>
#include <iostream>

using namespace std;


void module2(int x, int y)
{
    cout << "\n "  << __PRETTY_FUNCTION__ << ":\t x = " << x  << "\t y = " << y;
}

void module3(int x, int y, int z)
{
    cout << "\n "  << __PRETTY_FUNCTION__ << ":\t x = " << x  << "\t y = " << y << "\t z = " << z;
}


int main()
{
    using namespace std::placeholders;

    int a = 39;
    int b = 7;
    int c = 3;



    auto func_m2 = bind(&module2, _1, _2);
    func_m2(a, b);                                   //  OK

    auto func_m2_PH = bind(&module2, _2, _1);
    func_m2_PH(b, a);                                   //  OK

    //---------------------------------------------------------

    auto func_m3 = bind(&module3, a, b, c);
    func_m3();                                          //  OK

    cout << "\n With PlaceHolders:";

    auto func_m3_PH_0 = bind(&module3, _1, _2, _3);
    func_m3_PH_0(a, b, c);                              //  OK

    auto func_m3_PH_1 = bind(&module3, _2, _1, _3);
    func_m3_PH_1(b, a, c);                              //  OK

    auto func_m3_PH_2 = bind(&module3, _3, _1, _2);
    func_m3_PH_2(c, a, b);                              //  KO !!!

    auto func_m3_PH_3 = bind(&module3, _3, _2, _1);
    func_m3_PH_3(c, b, a);                              //  OK

    auto func_m3_PH_4 = bind(&module3, _1, _3, _2);
    func_m3_PH_4(a, c, b);                              //  OK

    auto func_m3_PH_5 = bind(&module3, _2, _3, _1);
    func_m3_PH_5(b, c, a);                              //  KO !!!

    return 0;
}

link to coliru

当第一个参数是一个带有2个参数的函数时,一切都很好:代码按我的预期工作。

但是,当第一个std :: bind的参数是带有3个(或更多)参数的函数时,代码将停止工作(我的情况被标记为'KO !!!')

但是,我对std :: bind及其占位符有什么期望?

在这种情况下,我期望输出:

void module3(int,int,int):x = 39 y = 7 z = 3

每次调用从

生成的函数对象时
bind(&module3, etc...)  

但是,更笼统地说:
我希望替换名为“ _K”的占位符的参数将是传递给基础函数的第K个参数(即std :: bind的第一个参数)。

怎么了?我对std :: bind的理解还是此功能模板中存在错误?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您将其倒退。 _K占位符定义从传递给生成的函子的第K个参数(bind的结果)到占位符在参数中的位置的映射绑定函数。因此,将_3放在bind的第一个参数位置意味着赋予绑定函数的第一个参数将是赋予 generate 函数的第三个参数。

其他情况下奏效的原因是您的反向逻辑恰好与正确版本相同。