我是打以防万一用的std ::功能和std ::绑定,我发现了一些非直观的,我想更好地理解它。
例如:
void fun()
{
}
void hun(std::string)
{
}
int main()
{
function<void(int)> g = &fun; //This fails as it should in my understanding.
function<void(int)> f = std::bind(fun); //This works for reasons unknown to me
function<void(int, std::string)> h = std::bind(hun); //this doesn't work
return 0;
}
它是如何可以将绑定function<void(int)>
到一个函数,是无效的()。 然后,我可以调用F(1),并得到乐趣()。 我想知道如何做到这一点。 微软的Visual Studio 2012的落实这里面去了我在不可读宏的海上失踪。 所以这就是为什么我在这里问这个问题。
如果不使用参数占位符( _1
, _2
,...),然后传递给函数的对象的任何参数从返回std::bind
只会被丢弃。 附:
std::function<void(int)> f = std::bind(fun, std::placeholders::_1);
我得到一个(长和丑陋的)错误预期。
感兴趣的Standardese的人:
§20.8.9.1.2 [func.bind.bind]
template<class F, class... BoundArgs>
*unspecified* bind(F&& f, BoundArgs&&... bound_args);
P3返回:一个转发呼叫包装g
具有弱结果类型(20.8.2)。 的效果g(u1, u2, ..., uM)
应INVOKE(fd, v1, v2, ..., vN, result_of<FD cv (V1, V2, ..., VN)>::type)
,其中,CV代表的CV -qualifiers g
和结合的参数的值和类型v1, v2, ..., vN
被如下规定确定 。
P10结合的参数的值v1, v2, ..., vN
和对应的类别V1, V2, ..., VN
取决于类型TiD
从呼叫衍生bind
和CV -qualifiers呼叫包装的CV g
如下:
- 如果
TiD
是reference_wrapper<T>
该参数被tid.get()
和它的类型Vi
是T&
; - 如果值
is_bind_expression<TiD>::value
是true
时,参数为tid(std::forward<Uj>(uj)...)
和它的类型Vi
是result_of<TiD cv (Uj...)>::type
; - 如果该值
j
的is_placeholder<TiD>::value
不为零时,该参数是std::forward<Uj>(uj)
和它的类型Vi
是Uj&&
; - 否则,该值是
tid
和它的类型Vi
是TiD cv &
通过调用生成函数模板转发调用包装bind
可以接受任何数量的额外的参数; 这些将被忽略。 一个的有效元数和最小的签名bind
表达由所确定的placeholder
在其构造中使用S,且可调用的参数(一个或多个)它们所键合。