作用:

某个模板类接受一个策略已特化类型的类型(如内存分配器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>类型了


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐