在以下示例中,占位符在 Boost::bind 中的角色
Role of placeholder in Boost::bind in the following example
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(&SomeMethod,_1)
的输出附加了一个参数 12。但是,我很难理解语句 2 中发生的事情。如果参数可以直接使用 boost::bind 传递(如语句 2 所示),那么为什么需要占位符?
占位符的用途之一是更改特定函数的参数顺序
示例取自 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 个参数!
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- boost::bind()类似的东西,但用于函数调用
- 使用 std::应用于 std::bind
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- 具有文本角色扮演功能的移动系统
- 开发C++/地图中的控制台角色扮演游戏
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind,无法让具有单个参数的方法工作
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 在以下示例中,占位符在 Boost::bind 中的角色