У меня сложный вопрос C ++: предположим, у меня есть mmap_allocator
класс шаблона, который является подклассом шаблона std :: allocator
класс и шаблонный класс mmappable_vector, который является подклассом
шаблона шаблона std :: 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> {
...
};
Что я могу сделать, это конвертировать из mmappable_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 :: vectors в
mmappable_vectors? Возможно ли это вообще в C ++?
Спасибо за любые идеи,
У вас нет конструктора шаблона в вашем mmappable_vector
который принимает два итератора любого типа. Как этот:
template <typename T, typename A = mmap_allocator<T> >
class mmappable_vector: public std::vector<T, A> {
typedef std::vector<T, A> Base;
...
template <typename Iter>
mmappable_vector(Iter first, Iter last, A a = A()) : Base(begin, end, a) {}
};
Увидеть http://www.sgi.com/tech/stl/stl_vector.h
Но более важно то, что вы вообще не должны определять свой вектор следующим образом:
template <typename T, typename A = mmap_allocator<T> >
class mmappable_vector: public std::vector<T, A> {
...
};
Это неправильно, потому что он происходит от контейнера STL, деривация является публичной, и у вас нет виртуального деструктора.
Насколько я понимаю твой вопрос — тебе просто нужен typedef. Существует два способа сделать typedef в C ++ — C ++ 11 и C ++ 03:
C ++ 11
template< typename T, typename A = mmap_allocator<T> >
using mmappable_vector = std::vector<T, A>;
C ++ 03
template <typename T, typename A = mmap_allocator<T> >
struct mmappable_vector {
typedef std::vector<T, A> type;
};
Используйте это как:
mmappable_vector<int>::type
Других решений пока нет …