在 Java 中,容器有一个详细的通用类层次结构。Java 定义了像 ICollection<T> 这样的接口,它由 ISet<T> 继承,由 IList<T> 继承并由 ArrayList<T> 实现。我想在我正在创建的 C++ 库中创建类似的层次结构。
然而,使用 C++ 模板会使这变得非常麻烦。例如,假设我定义了一个 ISet<T>:
template<typename T>
class ISet
{
public:
virtual ~ISet() = 0;
virtual void add(T e) = 0;
virtual size_t size() = 0;
virtual bool isEmpty()
{
return size() == 0;
}
};
然后,如果我想创建一个实现 ISet<T> 的 List<T>,我必须在类定义中列出我想要继承但不覆盖的每个方法,以便我以后调用它而不会造成混乱像 alist::ISet<T>->isEmpty():
template<typename T>
class List : public ISet<T>
{
public:
...
void add(T e)
{
...
}
virtual sz size()
{
...
}
using ISet<T>::isEmpty; //well this is annoying
};
我理解这样做的原因,并且“为什么这不按我期望的方式工作?” 已在这些问题中得到回答:here和here。
我的问题是,是否有一种干净(甚至任何!)的方法来实现这一点,而不必显式列出基类中每个继承但未覆盖的方法?
我真正想要的是可以放入 List<T> 的东西,例如:
using ISet<T>::*;
这将使 ISet<T> 中的所有方法都依赖于 List<T> 的类定义,并将它们别名为 List<T>::functionName。
请告诉我有一些方法可以实现这一点,而无需在每次更改我的模板化接口之一时更新每个继承类的 using 指令列表!
我是否必须求助于使用与接口一起定义的指令的预处理器定义?啊啊啊啊!