【问题标题】:How std::bind(&T::memberFunc, this) can always bind to std::function<void(void)> regardless of what T is?无论 T 是什么, std::bind(&T::memberFunc, this) 如何始终绑定到 std::function<void(void)> ?
【发布时间】:2018-03-20 06:50:28
【问题描述】:

据我所知,成员函数指针只能赋值给指向成员函数类型的指针,转换成除此之外的任何其他都是违反标准的吧?

当调用std::bind(&amp;T::memberFunc, this)时,它应该返回一个依赖于T的依赖类型。(在VC++版本的std中,它是一个名为_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 类型。

【问题讨论】:

  • 您的绑定不等同于void f0() { return a.func(); }void f1() { return b.func(); } 之类的吗?
  • 没有。还有return a.func();?这是什么?@Jean-BaptisteYunès
  • @francis,你看过这个explanation吗?
  • 是的,但我的答案不存在。@SmitYcyken

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


【解决方案1】:

简而言之,std::bind(&amp;A::func, &amp;a) 返回一个类的对象类似

class InternalClass
{
    A* a_;  // Will be initialized to &a
public:
    void operator()(void)
    {
        a_->func();
    }
};

[注意这是高度简化的]

可调用的operator() 函数与std::function&lt;void(void)&gt;void(void) 签名相匹配。

【讨论】:

  • 还是一头雾水。 InternalClass 仍然是一个依赖类型,不是吗?你能说得更具体点吗?
  • @francis 你的绑定是做什么的?想法是在对象 a(和对象 b)上绑定对成员 func 的调用,不是吗?那么成员funcona的调用签名是什么?一个不带参数且不返回任何内容的函数 void f()。
  • 是的,它们是平等的。但是,f0f1 是不同的东西。然后,std::function 神奇地覆盖了它们。即std::function 覆盖InternalClass&lt;A&gt;InternalClass&lt;B&gt;。这就是我试图理解的。@Jean-BaptisteYunès
  • @francis std::function 只关心可调用函数及其签名。
  • 但是A::funcB::func有不同的签名,对吧?@Someprogrammerdude
【解决方案2】:

我认为实现可能是这样的:

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

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多