成员函数具有隐式this
指针参数。为什么std::function
接受此签名,那么,S是一个简单的类? (complete sample)
std::function<void(S &)> func = &S::foo;
调用它也有效,并区分对象:
S s1 = {5};
S s2 = {6};
func(s1); //prints 5
func(s2); //prints 6
我通常期望它需要一个指针,它也可以起作用:(complete sample)
std::function<void(S * const)> func = &S::foo;
S s1 = {5};
S s2 = {6};
func(&s1); //prints 5
func(&s2); //prints 6
当隐式this
参数是指针时,将引用传递给成员函数时,为什么第一个工作正常?
答案 0 :(得分:5)
因为std::function
设计正确。 this
是指针的事实是历史事故和成员函数内部细节。事实应该对功能用户的设计决策没有影响。
当签名中的第一个参数类型是引用时,std::function
的设计者正确地决定接受成员函数。
答案 1 :(得分:3)
std::function<SIG>
可以从许多行为类似于函数的东西构建,将它们转换为适当的std::function
对象。
在这种情况下,void S::foo()
的行为与函数void foo_x(S&)
非常相似(因为它们都需要S
来调用,并可能修改S
,不返回任何内容。因此std::function<void(S&)>
提供了一个构造函数,用于将成员函数转换为函数对象。即。
std::function<void(S &)> func = &S::foo;
使用构造函数(如std::function<void(S&)>( void(S::)() )
)来创建等效于:
void foo_x(S & s ) { return s.foo(); }
std::function<void(S&)> func = foo_x;
类似地,
std::function<void(S * const)> func = &S::foo;
相当于
void foo_x(S * const s ) { return s->foo(); }
std::function<void(S* const )> func = foo_x;
通过像std::function<void(S* const )>( void(S::)() )
这样的构造函数。