c++ - 在 C++ 中绑定派生类方法以从分离的 std::function 变量中调用,在实例范围之外
问题描述
考虑拥有一个由多个子类继承的基类。
是否可以绑定它的一些方法来创建可以直接调用而不是从继承的类实例中调用的函数。
下面的例子应该强调这种情况:
class A {
virtual void method(int a, int b) { ... }
};
class B : public A {
virtual void method(int a, int b) { ... }
};
class C : public A {
virtual void method(int a, int b) { ... }
};
void main () {
A * a = new B();
A * aa= new C();
std::function<void(int,int)> f1 = std::bind(&A::method, &a);
std::function<void(int,int)> f2 = std::bind(&A::method, &aa);
f(1,2);
f(2,3);
...
}
但是,由于以下错误,它无法编译:
No viable conversion from '__bind<void (A::*)(int, int), A **>' to 'std::function<void (int, int)>'
也许有人可以帮我解决它?
解决方案
您需要为您的论点使用占位符。我还将从第二个参数中删除引用,因为您已经有了一个指针,并且传递对指针的引用将传递指针的地址,这不是您想要的。
std::function<void(int,int)> f1 = std::bind(&A::method, a, std::placeholders::_1, std::placeholders::_2);
希望这可以帮助。
推荐阅读
- c# - 编写ComboBox C#的第一行文本
- laravel - 更新服务 [默认](这可能需要几分钟)...失败
- ode - Casadi IVP 集成商 RHSFUNC 失败
- windows - Windows 上出现 0xc0000139 错误后的更多信息
- guava - 带有 limit() 和 omitEmptyStrings() 的 Guava Splitter 不一致
- android - NavigationComponent 从 BottomNavitationView 导航
- python - QRunnable 中的计时器
- azure-devops - 在 Azure Devops 构建步骤中使用 SolutionPackager 打包 Dynamics 365 解决方案时找不到所需文件错误
- javascript - 当我部署到 Heroku 时,它给了我一个语法错误
- amazon-web-services - AWS Glue 错误 - 调用 HeadObject 操作时发生错误 (403):禁止