c++ - 将 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;
}
编辑:修复了调用,因为愚蠢的错误,还稍微调整了可能有用的方法?
解决方案
我不确定我完全理解你想要什么,但是电话
d.foo();
不起作用,因为它接受类型为 base 的参数。您可以通过定义foo
不接受参数来解决这个问题。
class base {
public:
std::function<void(void)> foo;
};
然后 main 中的调用必须重写为
int main()
{
derived d;
d.foo = [&d]{ f(d); };
...
}
哪个有效,但可能不是您想要的。在此处查看实时示例;
推荐阅读
- scala - SBT:如何依赖同一项目中的交叉编译模块
- python - 在python中计算运行中位数的最短方法是什么?
- sdk - Spring Boot Application with S/4Hana On-Premise 使用 Cloud SDK 3.9.0
- database - 查找被锁定并存在编译问题的表、包、程序的列表
- python - Google Dataflow 作业(在 python 中):请求协助加入数据集:修复类型错误
- html - 如何在背景中设置图像,我使用 CSS 将图像放在背景中,但遗憾的是上曲线显示在右侧,但图像底部显示平坦
- php - 检查类是否可以在没有参数的情况下实例化
- tableau-api - 将字符串计数转换为计算字段
- mysql - MySQL 触发器 - 从单独的表添加
- visualization - 如何在VTK中将曲面显示为三角线?