【发布时间】:2016-11-11 07:42:50
【问题描述】:
鉴于以下情况:
class Observer
{
public:
virtual void Observe(Parameter p) = 0;
};
template<size_t Tag>
class TaggedObserver : public Observer { };
class Thing : public TaggedObserver<0>, TaggedObserver<1>
{
public:
virtual void Observe(Parameter p) override;
};
Thing::Observe 覆盖 TaggedObserver<0>::Observe 和 TaggedObserver<1>::Observe。
有没有办法为每个基类提供不同的覆盖?
基本原理:我希望该类能够观察两个相同类型的通知源,每个源具有不同的操作,而不必诉诸在参数中传递源然后在if/switch 中检查它。
【问题讨论】:
-
TaggedObserver<0>和TaggedObserver<1>是同一个类。为什么不创建两个子类? -
@JimV:他们不是。它们被模板化的目的是区分基类。
-
@JimV:
TaggedObserver<0>和TaggedObserver<1>可能基于相同的模板 类,但它们是不同的实例化 类。例如,就像std::vector<int>和std::vector<char>是不同的类一样。模板参数值是类类型的一部分,会产生不同的 RTTI 结果。 -
我有一个想法,但到目前为止它只产生了一个新问题:case of template member function specialization that works on msvc, not others。
-
P.S. FWIW 发布了一个替代解决方案 here 作为我相关问题的答案。就像下面@skypjack 的回答一样,它使用 CRTP 将基础
Observe“重新映射”为模板化的Thing::Observe<N>。
标签: c++ inheritance multiple-inheritance observer-pattern