stl rebind 机制
作用:某个模板类接受一个策略已特化类型的类型(如内存分配器allocator),那么我需要使用相同的策略,但是类型需要被替换(重新绑定),这时候便可以使用rebind机制,来实现策略不变,而更换类型来得到需要的类型如:在我们使用相关容器的时候,如vector, map等,我们一般是不需要传入allocator类型的,因为会默认填入std::allocator,即std::a
作用:
某个模板类接受一个策略已特化类型的类型(如内存分配器allocator),那么我需要使用相同的策略,但是类型需要被替换(重新绑定),
这时候便可以使用rebind机制,来实现策略不变,而更换类型来得到需要的类型
如:
在我们使用相关容器的时候,如vector, map等,我们一般是不需要传入allocator类型的,因为会默认填入std::allocator,即std::allocator<void>的特例化,是void类型
那么我们传入类型如int,float等类型的时候,便会出现一个需求,那么便是我需要将std::allocator<void>来得到类型std::allocator<int>类型,
这时候便需要rebind机制来实现
主要实现代码(以vector为例,不是实际源码,大概意思):
template<typename _t>
class allocator {
public:
template<typename _u>
using rebind_alloc = allocator<_u>;
};
template<typename _alloc>
class allocator_traits {
public:
typedef _alloc _alloc_type;
template<typename _t>
struct rebind {
typedef typename _alloc_type::template rebind_alloc<_t> other;
};
};
template<typename _t, typename _alloc=allocator<void>>
class vector {
public:
typedef typename allocator_traits<_alloc>::template rebind<_t>::other _tp_alloc_type;
};
int main() {
vector<int> a;
return 0;
}
class allocator:
为内存分配器,因为需要allocator_traits特征萃取器通用,因此会约定实现的allocator内存分配器,均要定义rebind_alloc来得到重新绑定后的allocator类型
class allocator_traits:
特征萃取器,这里是能够萃取出类型allocator类型,一般萃取器是有多个偏特化实现的,如传入的指针类型,也能得到实际的类型,偏特化参考
class vector:
容器类,有两个模板参数,类型_t,和内存分配器allocator<void>,这时候该如何如何得到allocator<int>类型呢,
通过typedef typename allocator_traits<_alloc>::template rebind<_t>::other _tp_alloc_type;
typename allocator_traits<_alloc>意思是获取得到_alloc内存分配器的类型(因为可能是指针,如传入的是allocator<void>*,那么我也希望得到allocator<void>,通过traits技术可以得到)
:template rebind<_t>::other,其实便是调用allocator约定的rebind_alloc来得到重新绑定的allocator<_t>类型了
更多推荐
所有评论(0)