3

我编写了以下代码,并没有考虑太多我在做什么,我真的很惊讶它实际上可以按我的预期工作。

有人可以解释为什么以及如何 bind 设法使用深层参数吗?

#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
using namespace placeholders;

int main()
{
    vector<string> s = { "abc", "aaaaaaa", "c" };

    for_each(s.begin(),s.end(),
             bind(printf,"string length is %d\n",bind(&string::length,_1)));
}
4

2 回答 2

3

该标准定义了一元类型特征is_bind_expression<T>,如果T是从 中返回的调用包装器类型std::bind(),或者该特征已专门用于用户定义的类型,则该特征为真。

当调用包装器被调用时,如果它的任何绑定参数是绑定表达式(由 确定is_bind_expression),则使用与调用外部表达式相同的所有参数调用该嵌套绑定表达式。嵌套的绑定表达式可以选择它具有占位符的任何参数(_1在您的示例中)。这是递归完成的,因此调用内部绑定表达式还将检查它的任何绑定参数是否是绑定表达式,并使用相同的参数集调用它们等等。

于 2012-12-17T18:39:19.063 回答
2

我不知道bind这到底是怎么回事,但我不认为这是一个谜,如果你能区分的话。

的类型bind可能会根据其输入类型而有所不同。因此bind,具有 a_1作为输入类型的 a 可以注意到它_1在其返回类型中消耗的事实(实际上,这很有意义)。 也可以从其参数中bind提取这一事实(参数中存在未绑定)。_1

引用一些std::bind文档:

如果 std::is_bind_expression::value == true (即另一个 sbind 子表达式在对 bind 的初始调用中用作参数),则立即调用该 bind-subexpressin 并将其结果传递给可调用对象。如果绑定子表达式有任何占位符参数,它们是从 u1, u2, ...中挑选出来的。

于 2012-12-17T16:12:06.737 回答