看起来您的愿望是允许每个类的实例与它们派生的类以及它们的所有兄弟姐妹(从其父类派生的类)进行 pub/sub 通信。
这是一个非常特殊的需求,而特殊的需求通常需要有趣的解决方案。
一种解决方案是为每个父类创建一个 pub/sub 类。每个类都将自己与其父类和自己的类相关联(以便它可以分别与其兄弟姐妹和所有后代进行通信)。
template <typename T>
struct PubSubSingleston
{
static PubSubManager instance;
}
template <typename T>
PubSubManager PubSubSingleton<T>::instance;
然后一个类可以将自己与那些发布-订阅“层”相关联。如果你支持的话,最干净的方法可能是多重继承
template <typename ClassT, typename ParentT>
class PubSubHelper
{
public:
PubSubHelper()
{
PubSubSingleton<ClassT>::instance.associate(this);
PubSubSingleton<ParrentT>::instance.associate(this);
}
void publish(const Message& inMessage)
{
PubSubSingleton<ClassT>::instance.publish(inMessage);
}
};
class X
: public B
, PubSubHelper<X, B>
{ ... }
还有许多其他模式(如 CRTP)可以使用它,但基本技术是将一个类与一些与其自身关联的 PubSub 对象相关联,另一个与它的父对象相关联。