首页 > 解决方案 > 将 std::function 与继承的类一起使用

问题描述

我对一些功能性回调有一点问题。如何定义一个函数,以便我可以拥有派生 x 的 f,并将其分配给派生,但鉴于函数对象需要基类。这可以做到吗?这在逻辑上是有道理的。也许我错过了某种形式的指针用法?

这是我作为可复制基础工作的实际软件的简化形式。

#include <functional>
#include <iostream>

class base {
public:
 std::function<void(base*)> foo;    
};

class derived : public base {
public:
//EDIT:Would this work?
 std::function<void(derived*)> foo;
 int bar = 0;
};

void f(derived* x)
{
    x->bar++;
}

int main()
{
   derived d;
   d.foo = f; //Issue no matching operator, LHS std::function<void(base)> , RHS void(derived)   

   d.foo(&d); //No match for call to std::function<void(base)>
   std::cout << d.bar;
}

编辑:修复了调用,因为愚蠢的错误,还稍微调整了可能有用的方法?

标签: c++functional-programmingstl

解决方案


我不确定我完全理解你想要什么,但是电话

  d.foo();

不起作用,因为它接受类型为 base 的参数。您可以通过定义foo不接受参数来解决这个问题。

class base {
public:
 std::function<void(void)> foo; 
}; 

然后 main 中的调用必须重写为


int main()
{
   derived d;
   d.foo = [&d]{ f(d); };
   ...
}

哪个有效,但可能不是您想要的。在此处查看实时示例;


推荐阅读