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是关键。