我给您一个简单的代码段:
#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;
}
当第一个参数是一个带有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的理解还是此功能模板中存在错误?
感谢您的时间。
答案 0 :(得分:2)
您将其倒退。 _K
占位符定义从传递给生成的函子的第K
个参数(bind
的结果)到占位符在参数中的位置的映射绑定函数。因此,将_3
放在bind
的第一个参数位置意味着赋予绑定函数的第一个参数将是赋予 generate 函数的第三个参数。
其他情况下奏效的原因是您的反向逻辑恰好与正确版本相同。