【发布时间】:2014-10-10 11:29:12
【问题描述】:
如果我有这个简单的案例:
struct Foo
{
void bar();
void baz(int );
};
这会编译是有道理的:
Foo foo;
auto f = std::bind(&Foo::bar, &foo);
但是为什么bind 会被设计成这样编译:
auto g = std::bind(&Foo::baz, &foo);
我可以打电话给f,但我不能打电话给g。为什么还要编译?要求我必须这样做的理由是什么:
auto g2 = std::bind(&Foo::baz, &foo, std::placeholders::_1);
如果你想弄乱 哪些 参数被传递以及以什么顺序传递,我可以理解使用占位符,但为什么不只使用默认传递 all 中的参数无需指定的正确顺序?
【问题讨论】:
-
可能是因为没有办法获取函数的参数数量,否则,这意味着生成的函数对象必须允许 any 数量的参数,包括没有,如果(例如)
g在没有参数的情况下被“调用”,这将导致未定义的行为。 -
我认为
std::placeholders执行两个功能,1. 正如您所说,它们将参数从源路由到接收器,2. 它们指示需要多少个参数。 -
boost 库可能有更多与
bind相关的原始设计原理。 -
boost::bind如果你有一个 arity 不匹配,实际上通常不会编译,但它有bind的无数重载...你的代码的问题是它与指向的指针匹配-member-data 重载(并且R T::*也可以匹配指向成员函数的指针,并将 R 推导出为函数类型)。