テンプレート引数は、指しているオブジェクトの内容とは関係ありません。これが機能する理由はありません。説明する
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
!
OK、さらに情報を提供したので、まったく別のことをしたいのは明らかです。ここにいくつかのスターターがあります:
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
。少し運が良ければ、そのテンプレートを目的に使用できます (私はテストしていません)。