【问题标题】:Role of placeholder in Boost::bind in the following example以下示例中占位符在 Boost::bind 中的作用
【发布时间】:2013-09-08 05:03:15
【问题描述】:

关于占位符的使用有很多关于 SO 的示例,但是我仍然有点困惑,如果有人能解释以下两个语句之间的区别,我将不胜感激

void SomeMethod(int a)
{
    std::cout << "Parameter pass " << a << "\n";
}

Statement 1 : boost::bind(&SomeMethod,_1)(12);

Statement 2 : boost::bind(&SomeMethod,12)();

我相信我理解声明 1 是链接。 boost::bind(&amp;SomeMethod,_1) 的输出会附加一个参数 12。但是我很难理解语句 2 中发生了什么。如果可以使用 boost::bind 直接传递参数(如语句 2 中所示),那么为什么需要占位符?

【问题讨论】:

  • 如果您想立即调用bind 的结果,那么您首先不需要bind。真正的用例是现在调用bind,稍后调用结果300个函数和5000行。

标签: c++ boost-bind


【解决方案1】:

占位符的用途之一是更改特定函数的参数顺序

示例取自 boost 。假设您之前拥有f(x, y)g(x,y,z)。那么

bind(f, _2, _1)(x, y);                 // f(y, x)    
bind(g, _1, 9, _1)(x);                 // g(x, 9, x)    
bind(g, _3, _3, _3)(x, y, z);          // g(z, z, z)    
bind(g, _1, _1, _1)(x, y, z);          // g(x, x, x)

有趣的是,注意以下关于最后一个示例的 BOOST 指南声明

请注意,在最后一个示例中,由 bind(g, _1, _1, _1) 生成的函数对象不包含对第一个以外的任何参数的引用,但它仍然可以与多个参数一起使用。任何额外的参数都会被忽略,就像第三个示例中的第一个和第二个参数被忽略一样。

我认为现在很明显,占位符使这种替换更简洁、更优雅。

在您的特定情况下,这两种用途是等效的。

可以选择性地只绑定一些参数。 bind(f, _1, 5)(x) 等价于 f(x, 5);这里 _1 是一个占位符参数,意思是“用第一个输入参数替换”。

占位符的另一个很好的用途是当您有很多参数并且您只想绑定其中一个时。示例:想象h(a,b,c,d,e,f,g),而您只想绑定第 6 个参数!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多