次の機能を持つ stl のようなコンテナー クラスを作成しています。
Iterator begin(){
return Iterator(data_.begin(), 1);
}
ConstIterator begin() const{
return ConstIterator(data_.begin(), 1);
}
両方を置き換える1つの関数を作成できると思います:
template <typename itr0, typename itr1>
itr0 begin(){
return itr1(data_.begin(), 1);
}
以下を呼び出すと、コンパイル時にコードが生成されます。
Iterator it = foo.begin<Iterator, Iterator>();
ConstIterator it = foo.begin<ConstIterator const?, ConstIterator>();
私の最初の質問は、実際には typename は何ConstIterator begin() const
ですか?
第二に、このメタプログラミングがクラスの外部から透過的になるようにする方法はありますか? つまり、標準的な方法で記述されているかのように、次のコードを使用して begin() を呼び出すことはできますか?
C foo;
const C foo2;
Iterator it = foo.begin();
ConstIterator it = foo2.begin();