|
泛型 :基于策略的basic_string实现(2) class T = char_traits<E>, class A = allocator<E> > class basic_string; } E是字符串的字符类型(大多数情况下,不是char就是wchar_t),T控制字符串如何比较和拷贝,A是分配器(allocator),它正如我们都知道的:爱它,但从不用它。我们要增加第四个模板参数,控制字符串的真正实现。因为它真正处理字符串的存储,我们叫它Storage策略 我们叫我们的新字符串flex_string,因为,你们很快就会看到,它是多么的灵活(flexible) template <class E, class T = char_traits<E>, class A = allocator<E>, class Storage = AllocatorStringStorage<E, A> > class flex_string; Storage的默认值是AllocatorStringStorage<E,A<,这是一个直观的存储实现,使用热情拷贝(eager copy)(某种COW的对立面)。在其实现中,flex_string保存一个Storage对象并使用它的内部类型和成员函数。 你选择的Storage的接口可能会有些微区别。基本上,当我浏览了几遍我的basic_string实现后,我发现了如果没有一些函数我就不可能提供实现,而且这些函数也不会太多,这里是一个Storage策略实现必须满足的半正式的条件规格 template <typename E, 其他参数< class StorageImpl { public: typedef 某类型 size_type; typedef 某类型 iterator;; typedef 某类型 const_iterator; typedef 某类型 allocator_type; StorageImpl(const StorageImpl &); StorageImpl(const allocator_type&); StorageImpl(const E* s, size_type len, const allocator_type& a); StorageImpl(size_type len, E, const allocator_type&); iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; size_type size() const; size_type max_size() const; size_type capacity() const; void resize(size_type, E); void reserve(size_type); void swap(StorageImpl&); const E* c_str() const; const E* data() const; allocator_type get_allocator() const; }; 这些足够了。规范很简单(而且如果没有allocator这个还会更简单)。这里的想法是你能够最终借助Storage中很少的核心类型和函数有效地实现basic_string的整个接口。 Flex_string类保存一个Storage对象的值。我为了一些小小的方便选择私有继承。这样,供下载代码中的flex_string就象这样。 template <class E, class T = std::char_traits<E>, class A = std::allocator<E>,
|