我写了下面的代码而没有考虑我在做什么,我真的很惊讶它实际上是按照我的意图运作。
有人可以解释为什么以及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)));
}
答案 0 :(得分:3)
标准定义了一元类型特征is_bind_expression<T>
,如果T
是从std::bind()
返回的调用包装类型,或者特征是专门用于用户定义的类型,则该特征是真的。
当调用调用包装器时,如果其任何绑定参数是绑定表达式(由is_bind_expression
确定),则调用该嵌套绑定表达式时使用与调用外部表达式相同的所有参数。嵌套的绑定表达式可以选择任何具有占位符的参数(在您的示例中为_1
)。这是以递归方式完成的,因此调用内部绑定表达式还将检查其任何绑定参数是否为绑定表达式,并使用相同的参数集调用它们,依此类推。
答案 1 :(得分:2)
我不知道bind
到底是怎么做到的,但我不认为这是一个谜,如果你有所区别。
bind
的类型可能因其输入类型而异。因此,bind
作为输入类型的_1
可以注意到它在返回类型中消耗_1
的事实(实际上,这很有意义)。 bind
也可以从其参数中提取此事实(参数中存在未绑定的_1
)。
引用一些std::bind
文档:
如果std :: is_bind_expression :: value == true(即另一个sbind subexpression在初始调用bind中用作参数), 然后立即调用bind-subexpressin,结果是 传递给invocable对象。如果bind子表达式有任何 占位符参数,它们是从u1,u2,....中选取的。