std :: vector子类与自定义分配器和std :: vectors之间的转换

时间:2012-10-17 14:32:08

标签: c++ templates constructor subclassing allocator

我有一个高级的C ++问题:假设我有一个mmap_allocator template类,它是std :: allocator模板的子类 class和mmappable_vector模板类,它是一个子类 std :: vector template class:

    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 ++中是否可行?

感谢您的任何见解,

  • 约翰内斯

1 个答案:

答案 0 :(得分:2)

你的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。有两种方法可以在C ++中使用typedef - 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