std::函数参数子类
std::function parameter subclass
我一直试图避免使用C风格的函数指针来支持std::函数对象,但在继承时调用成员函数时遇到了问题。
我有一个接收std::function:的方法
class A
{
public:
void testCallbackA();
// this is unrelated, but I need some features from the superclass
void goingToNeedThisWhenCallingTestCallbackA(int someParams);
};
void method(std::function<void(A*)> callback);
method(&A::testCallbackA); // this works fine
现在一切都很好,但当我想用方法使用A子类时,我需要转换函数指针:
class B : public A
{
public:
void testCallbackB() { }
};
method(&B::testCallbackB); // this fails
std::function<void(A*)> call = &B::testCallbackB; // this fails
std::function<void(B*)> call = &B::testCallbackB; // this works
如果我想能够调用方法(&B::testCallbackB),我需要键入一个函数指针,并以这种方式进行强制转换:
typedef void (A::*Callback)();
std::function<void(A*)> call = (Callback)&B::testCallbackB; // this works
我能避开这个typedef吗?我能避开演员阵容吗?我试着调查std::绑定,但运气不好。
有什么想法吗?
此转换应该失败,因为这是个坏主意。std::function<void(A*)>
可与任意A*
一起调用,无论所指向的实际对象是否为B
。在不是B
的A
上调用B
成员函数的结果是未定义的行为。
您可能需要std::bind
,就像中一样
B b;
method(std::bind(&B::testCallbackB, b));
如果我很理解您的问题,那么我建议您将类A中的testCallbackA设置为虚拟,然后简单地使用&A: :testCallback调用方法时的A。
动态方法调度将负责调用实际类的方法,并且您不必手动规避类型安全。
相关文章:
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在子类函数覆盖中省略具有默认值的参数
- 将方法参数类型更改为子类中的派生类
- 获取参数的子类
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- 子类化 std::thread:构造器中可变参数模板函数的问题
- 子类作为模板模板基类的模板参数,而该类别又是子类函数参数
- 在子类中定义可变参数函数专用化
- 是否有必要调用父构造函数而不使用子类构造函数的参数?
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 类型的C 参数与父母和子类的类型参数不相容
- 将子类作为构造函数中的参数
- 如何在子类方法中更改参数
- c++将子类作为参数传递
- C++ 不同的子类需要不同的参数
- 将基类 2 参数构造函数调用到子类 1 参数构造函数中
- C++-使指向超类的指针与函数中的子类参数匹配
- CRTP+可变模板+提取CRTP子类参数