高度なC++の質問があります。std::allocatorテンプレートクラスのサブクラスであるmmap_allocatorテンプレートクラスと、std::vectorテンプレートクラスのサブクラスであるmmapable_vectorテンプレートクラスがあるとします。
template <typename T>
class mmap_allocator: public std::allocator<T> {
...
};
template <typename T, typename A = mmap_allocator<T> >
class mmappable_vector: public std::vector<T, A> {
...
};
私にできることは、関数テンプレートを使用して、mmapable_vector(mmap_allocatorを使用)からstd :: vector(標準アロケータを使用)に変換することです。
template <typename T>
std::vector<T> to_std_vector(const mmappable_vector<T> &v)
{
return std::vector<T>(v.begin(), v.end());
}
しかし、他の方法は不可能のようです。
template <typename T>
mmappable_vector<T> to_mmappable_vector(const std::vector<T> &v)
{
return mmappable_vector<T>(v.begin(), v.end());
}
次のようなコンストラクターを定義するときの問題:
typedef typename std::vector<T, A>::iterator iterator;
mmappable_vector(iterator from, iterator to):
std::vector<T,A>(from, to)
{
}
これはmmap_allocatorでイテレータを使用するため、to_mmappable_vectorの呼び出しとは一致しません。一方、コンストラクターを定義する:
mmappable_vector(std::vector<T,std::allocator<T> > v):
std::vector<T,std::allocator<T> >(v)
{
}
失敗する
std::vector<T,std::allocator<T> >
mmappableベクトルの基本クラスではありません。
std :: vectorをmmappable_vectorsに変換する関数テンプレートを作成するにはどうすればよいですか?これはC++内でまったく可能ですか?
洞察をありがとう、
- ヨハネス