基本上,我试图写有一个通用的迭代的基类。C++虚拟的boost ::任何继承
因此很明显,模板虚拟功能不起作用,这就是为什么我想的boost ::任何,但它仍然不会重载Iterator的get()方法(它继续抛出下面定义的Exception)。我似乎也无法使其成为纯虚拟的,因为编译器抱怨'虚拟迭代器begin()= 0;' (它表示'不能创建抽象类Iterator的实例')。
我有非常具体的限制,我必须/要坚持,所以可能会考虑替代解决方案的问题,但可能无法使用。
下面是代码的一部分:
template <class T, class C>
class Iterator
{
public:
virtual T& operator*() { T *t = boost::any_cast<T>(&get()); return *t; };
virtual boost::any& get() { throw new Exception("get not overridden!!"); };
//virtual boost::any& get() = 0;
protected:
C::iterator iter;
};
template <class T>
class VectorIterator: public Iterator<T, std::vector<T> >
{
public:
VectorIterator(std::vector<T>::iterator iterator): Iterator<T, std::vector<T> >(iterator) { };
virtual boost::any& get() { return *iter; };
};
template <class Value, class Container>
class Repository
{
public:
typedef Iterator<Value, Container> iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
};
class SomeRepository : public Repository<RandomClass, std::vector<RandomClass> >
{
public:
iterator begin() { return VectorIterator<RandomClass>(items.begin()); };
iterator end() { return VectorIterator<RandomClass>(items.end()); };
}
那么,为什么没有工作,(如何)可以解决呢? PS:我知道这与另一个问题非常相似,但我无法准确地将其纳入评论中,而且我不知道我还能够把它放在哪里。
UPDATE:
所以我设法让GET推测出来的东西()返回一个void(EWW)指针和忘掉的boost ::任何。但它仍然调用Iterator :: get而不是VectorIterator :: get(正如我原来的问题)(当我尝试使用* someRepository.begin())时,有人知道为什么吗?
我很好奇。这应该达到什么目的?如果你想在迭代器上输入erase,那么有更好的方法可用。 – pmr
'抛出新的异常(...);' - 请不要... – Xeo
@pmr我们的代码中存在迭代通过Repository的所有元素的现有功能,我认为更好的方法是创建一个这个泛型迭代器。 – Dukeling