我在下面以“简单”的方式举例说明了我想要做的事情。我有一个抽象类A
,它使用两种方法向世界公开一个公共接口:operator==
和performTasksSpecificToA
。您可以看到我正在使用“模板方法模式”以及“奇怪的重复模板模式”,以确保A
的用户不必担心{{1}的实现},换句话说A
,同时仍能检查两个AImpl
实例的相等性。有关此方法的更多信息和背景信息,请参阅this answer on SO。
现在,假设我希望按如下方式定义一个类AImpl
:
B
正如您所看到的,在定义用于比较子类的公共 class B
{
public:
virtual ~B() = 0;
bool operator(const B& b) const;
void performTasksSpecificToB();
};
方面,类B
与A
具有相同的问题。如何定义父类,我们称之为operator==
,以避免在Letter
和A
之间复制代码?
这是我的'简单示例',它编译并运行。
B
答案 0 :(得分:0)
如果您允许Letter
成为模板,则只需从模板库继承A
:
template<class T>
class Letter
{
public:
bool operator==(const Letter<T>& t) const {
const T& t1 = static_cast<const T&>(*this);
const T& t2 = static_cast<const T&>(t);
return t1.checkEquality_(t2);
}
private:
virtual bool checkEquality_(const T& a) const = 0;
};
class A : public Letter<A>
{
public:
virtual ~A() = 0;
void performTasksSpecificToA();
};
...
如果您绝对需要通用的Letter
,则可能需要添加另一层CRTP,就像使用A_
和A
一样。