我正在尝试实现一个数据结构的不同版本。假设它有一个如下所示的接口(它是简化的):
template <typename T>
class Base {
public:
class Iterator {
virtual auto operator*() -> T& = 0;
};
public:
virtual auto Find(const T& value) -> Iterator = 0;
}
现在我想继承一个实现它的类:
template <typename T>
class Derived : public Base<T> {
public:
class Iterator {
auto operator*() -> T& override {
/* ... */
}
};
public:
auto Find(const T& value) -> Iterator override {
/* ... */
};
}
问题是,我需要基于Derived
的功能实现Iterator
,但Find
函数的签名由于Derived::Iterator
而中断(应该是Base::Iterator
)。有没有办法做到这一点,或者我必须给予使用接口类?
1条答案
按热度按时间slsn1g291#
据我所知,你试图实现的是与类型擦除或静态多态有关的。您希望Base::Iterator是一个非抽象的通用类型,可以从任何Derived实现构造。
这是一个动态的解决方案,您可以根据自己的需要进行优化
另一种方法是使用模板和CRTP创建静态接口。CRTP是一种技术,涉及使用基类的模板参数将派生类型信息传递回基类,并使用该信息定义或查找基于派生类型的Base迭代器的实现。