std のようなインターフェイスを使用してデータ構造クラスを構築し、データ構造にさまざまな反復子を実装しています。
概念的には、私がやりたいことは次のようなものです。
template <class DataT>
class DataStructure
{
protected:
DataT& Data;
public:
DataStructure(DataT& data) : Data(data) {}
class BaseIterator
{
public:
BaseIterator()
{
cout<<"BaseIterator"<<endl;
}
};
class DerrivedIterator1 : public BaseIterator
{
public:
DerrivedIterator1()
{
cout<<"DerrivedIterator1"<<endl;
}
};
class DerrivedIterator2 : public BaseIterator
{
public:
DerrivedIterator2()
{
cout<<"DerrivedIterator2"<<endl;
}
};
template<class IterT>
IterT Begin()
{
//none-specialized implementation. Possibly throw exception
}
template<>
DerrivedIterator1 Begin<DerrivedIterator1>()
{
//Find beginning for DerrivedIterator1
}
template<>
DerrivedIterator2 Begin<DerrivedIterator2>()
{
//Find beginning for DerrivedIterator1
}
};
ただし、これはもちろんコンパイルされません。C++ では、特殊化されていないテンプレート コンテナーでテンプレート メンバー関数を特殊化することが許可されていないためです。
明らかな回避策は、もちろん、Begin_Iterator1 と Begin_Iterator2 の 2 つの異なる関数を宣言し、それを実行することです。しかし、インターフェイスを変更しない回避策を探しています。
何か案は?
編集:これはHW割り当てのためであることを忘れていたので、boostやstdでさえオプションではありません。