据我所知,成员函数指针只能指向成员函数类型的指针,并且转换为除此之外的任何其他都会违反标准,对吗?
当调用std::bind(&T::memberFunc, this)
时,它应该返回依赖于T
的依赖类型。(VC ++版本的标准中的,它是一个名为_Binder
的类模板)。
因此问题就是为什么一个std::funcion
可以涵盖所有_Binder
(VC ++版本)类型。
class A
{
public:
void func(){}
};
class B
{
public:
void func(){}
};
std::function<void(void)> f[2];
A a;
B b;
f[0] = std::bind(&A::func, &a);
f[1] = std::bind(&B::func, &b);
我无法想象存储该函数的std :: funcion成员的类型是什么样的,除非我从一开始就错了。
This question仅涵盖需要使用它的实例调用的成员函数。
但我的意思是为什么一个std::function
类型可以容纳所有T
类型。
答案 0 :(得分:3)
简而言之,std::bind(&A::func, &a)
将类类的对象返回到
class InternalClass
{
A* a_; // Will be initialized to &a
public:
void operator()(void)
{
a_->func();
}
};
[请注意,这是高度简化的]
可调用operator()
函数与void(void)
的{{1}}签名匹配。
答案 1 :(得分:0)
我认为该实现可能会这样:
template</*...*/>
class std::bind</*...*/>
{
public:
std::bind(callable_t call, param_t p)
{
_func = [call, p]()/* using lambda to capture all data for future calling */
{
p->call();
};
}
operator std::function<void(void)>()
{
return _func;
}
private:
std::function<void(void)> _func;
};
lambda 是关键。