我有一个高级的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 ++中是否可行?
感谢您的任何见解,
答案 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