我在一些函数回调中遇到了一个小问题。如何定义一个函数,以便我可以有一个f派生的x,并将其分配给派生的,但是给定的函数对象想要基类。能做到吗?从逻辑上讲,这是有道理的。也许我缺少某种形式的指针用法?
这是我正在复制的基本软件的简化形式。
#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;
}
编辑:修复了调用,因为愚蠢的错误,还对可能的工作做了一些微调?
我不确定我是否完全了解你想要什么,但打来电话
d.foo();
不起作用,因为它接受base类型的参数。您可以通过定义foo
不采用参数来解决此问题。
class base {
public:
std::function<void(void)> foo;
};
主电话然后必须改写为
int main()
{
derived d;
d.foo = [&d]{ f(d); };
...
}
这有效,但可能不是您想要的。参见在线示例here;