Преобразование между подклассом std :: vector с пользовательским распределителем и std :: vectors

У меня сложный вопрос 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 ++?

Спасибо за любые идеи,

  • Johannes

1

Решение

У вас нет конструктора шаблона в вашем 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
2

Другие решения

Других решений пока нет …