基本上,我試圖寫有一個通用的迭代的基類。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