无论T是什么,std :: bind(&amp; T :: memberFunc,this)如何始终绑定到std :: function <void(void)>?

时间:2018-03-20 06:50:29

标签: c++ c++11 std-function stdbind

据我所知,成员函数指针只能指向成员函数类型的指针,并且转换为除此之外的任何其他都会违反标准,对吗?

当调用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类型。

2 个答案:

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