std::bind(&T::memberFunc, this) 如何始终绑定到 std::function<void(void)> 而不管 T 是什么?
How std::bind(&T::memberFunc, this) can always bind to std::function<void(void)> regardless of what T is?
据我所知,成员函数指针只能赋值给指向成员函数类型的指针,除此之外转换成任何其他的都会违反标准,对吧?
并且在调用std::bind(&T::memberFunc, this)
时,它应该return一个依赖于T
的依赖类型。(在VC++版本的标准中,它是一个名为 _Binder
) 的 class 模板。
所以问题就变成了为什么一个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 成员的类型,除非我从一开始就错了。
只覆盖了需要用它的实例调用的成员函数。
但我的问题是为什么一个 std::function
类型可以容纳所有 T
类型。
简而言之,发生的事情是 std::bind(&A::func, &a)
returns class 与
相似 的对象
class InternalClass
{
A* a_; // Will be initialized to &a
public:
void operator()(void)
{
a_->func();
}
};
[注意这是高度简化的]
可调用的 operator()
函数与 std::function<void(void)>
的 void(void)
签名匹配。
我认为实现可能是这样的:
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是关键。
据我所知,成员函数指针只能赋值给指向成员函数类型的指针,除此之外转换成任何其他的都会违反标准,对吧?
并且在调用std::bind(&T::memberFunc, this)
时,它应该return一个依赖于T
的依赖类型。(在VC++版本的标准中,它是一个名为 _Binder
) 的 class 模板。
所以问题就变成了为什么一个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 成员的类型,除非我从一开始就错了。
但我的问题是为什么一个 std::function
类型可以容纳所有 T
类型。
简而言之,发生的事情是 std::bind(&A::func, &a)
returns class 与
class InternalClass
{
A* a_; // Will be initialized to &a
public:
void operator()(void)
{
a_->func();
}
};
[注意这是高度简化的]
可调用的 operator()
函数与 std::function<void(void)>
的 void(void)
签名匹配。
我认为实现可能是这样的:
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是关键。