gpt4 book ai didi

C++回调到非静态接口(interface)方法

转载 作者:行者123 更新时间:2023-11-28 01:03:26 24 4
gpt4 key购买 nike

我有一个类 A,它应该从接口(interface)类 B 调用一个非静态类方法,其签名由以下函数指针表示:

bool (B::*check)(int) 常量

这样的方法将由一组实现 B 的类 {C} 来实现,每个类都有多个与上述签名匹配的方法。因此,我需要将 A 的回调绑定(bind)到 B,B 又会委托(delegate)给 C 的选定方法。

用一些代码编辑:

这是我心中的草图。请注意,这只是上述要求的一个示例,代码组织中的任何内容都不是强制性的,也许是 A 类。

class B {
public:
bool check(int val) const {
// call to a binded method with a given signature (sig) on a Cx class
...
}
};

class C1: public B {
...
// a method implementing the (sig) signature
// another method implementing the (sig) signature
};


class C2: public B {
...
// a method implementing the (sig) signature
// another method implementing the (sig) signature
};

class A {
public:
...
private:
bool result;
int val;

void call_check(B const& b) const {
result = b.check(val);
}
...
};

在 C++ 中可能吗?或者等价地,允许 A 只知道类 B 的解决方案是什么?

令我困惑的是,我还没有找到满足这一非常具体需求的解决方案。

最佳答案

大量编辑

我想我得到了你想要的,基于一些繁重的类型转换。

请注意,我推荐这种技术。尽管我的示例有效,但我相信这里存在一些可能真正搞砸事情的大陷阱。

和以前一样,A 类可以接受适当签名的方法和对象(B 类型,或从 B 派生的对象) >,例如您的 C 类),并在指定的对象上调用指定的方法。

B 实际上根本没有任何方法,只是作为 C1C2 这两个类的公共(public)基类>.

底部是一个main,演示了它是如何使用的。我省略了两个 SetCallback*** 方法的实现,因为它们很简单。

class B
{ public: // Has nothing, only serves as base-class for C1 and C2.
};

class C1: public B
{
public: bool DoThis(int x) const { return true; }
};

class C2: public B
{
public: bool DoThat(int x) const { return false; }
};

class A
{
private:
bool (B::*m_check)(int) const;
B* m_Obj;

public:
void SetCallbackFunction(bool (B::*fnc)(int) const)
{ m_check = fnc; }

void SetCallbackObject(B* pB)
{ m_Obj = pB; }

bool InvokeCallback(int val)
{
return (m_Obj->*m_check)(val);
}
};

int _tmain(int argc, _TCHAR* argv[])
{
A a;
C1 c;

bool (C1::*func)(int) const;
bool (B::*b_func)(int) const;

func = &C1::DoThis;
b_func = (bool (B::*)(int) const)(func); // Dangerous Typecasting. Use caution!

a.SetCallbackFunction(b_func);
a.SetCallbackObject((B*)(&c)); // A simpler, safer typecast.

a.InvokeCallback(5); // Ends up calling C1::DoThis.

_getch();
return 0;
}

关于C++回调到非静态接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com