【问题标题】:About "bind" in C++关于 C++ 中的“绑定”
【发布时间】:2017-03-31 14:58:08
【问题描述】:

代码如下:

vector<int> vec{ 0, 1, 2, 3, 4, 5, 6, 7 };
string str("123456");
auto result = find_if(vec.begin(), vec.end(), bind(check_size, str, _1));

它不会像这样将vec 传递给_1:(但代码可以正常运行)

auto checkn = bind(check_size, str, _1);
checkn(vec);

这是否意味着_1 可以自动接收vec?我对此感到很困惑。

【问题讨论】:

  • find_if 不会将vector 传递给它,而是将vector 的元素传递给它。
  • 谢谢!我很困惑 bind 怎么知道 _1 是什么。
  • _1 只是bind 声明的占位符。传入的参数由调用者决定,即这里的find_if

标签: c++ c++11 functional-programming bind


【解决方案1】:

如果您有一个可调用对象,例如一个函数,您可以使用 std::bind() 创建另一个可调用对象,方法是将它的一些参数绑定到固定值,并将其他参数留待以后提供.后者用placeholders标识,命名为_1_2_3等。

在您的示例中,假设 check_size() 是一个带有两个参数的函数,bind(check_size, str, _1) 将返回一个具有一个参数的可调用对象。对于任何参数x,此可调用对象将返回值check_size("123456",x)

当在您的 find_if 上下文中使用时,bind(check_size, str, _1) 将因此为向量中的每个 int 项目调用,直到结果为真。

在第二种情况下,callable 将使用 vec 作为参数调用。这可能会或可能不会编译,具体取决于 check_size() 的定义方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多