模板参数与您指向的对象的内容无关。没有理由这应该起作用。为了显示
struct Base { };
struct Derived : Base {};
template<typename T> struct A { int foo; };
template<> struct A<Base> { int foo; int bar; };
A<Derived> a;
A<Base> *b = &a; // assume this would work
b->bar = 0; // oops!
您最终将访问!bar
中不存在的整数。a
好的,既然您提供了更多信息,很明显您想做一些完全不同的事情。这是一些启动器:
template<typename T>
struct MyIterator : std::iterator<...> {
MyIterator():ibase() { }
template<typename U>
MyIterator(U u):ibase(new Impl<U>(u)) { }
MyIterator(MyIterator const& a):ibase(a.ibase->clone())
MyIterator &operator=(MyIterator m) {
m.ibase.swap(ibase);
return *this;
}
MyIterator &operator++() { ibase->inc(); return *this; }
MyIterator &operator--() { ibase->dec(); return *this; }
T &operator*() { return ibase->deref(); }
// ...
private:
struct IBase {
virtual ~IBase() { }
virtual T &deref() = 0;
virtual void inc() = 0;
virtual void dec() = 0;
// ...
virtual IBase *clone() = 0;
};
template<typename U>
struct Impl : IBase {
Impl(U u):u(u) { }
virtual T &deref() { return *u; }
virtual void inc() { ++u; }
virtual void dec() { --u; }
virtual IBase *clone() { return new Impl(*this); }
U u;
};
boost::scoped_ptr<IBase> ibase;
};
然后您可以将其用作
MyIterator<Base> it(l.begin());
++it;
Base &b = *it;
你可能想调查一下any_iterator
。运气好的话,您可以将该模板用于您的目的(我还没有测试过)。