basic_string GCC 和自定义指针中 libstdc++ 的实现
basic_string implementation of libstdc++ in GCC and custom pointers
最近想研究一下libstdc++源码(GCC 7.2),一头雾水。可能我错过了一些重要的东西,但我开始认为完全符合 C++ 标准的 basic_string class 是不可能实现的。
这是我遇到的一个问题。
- basic_string 应该能够接受自定义分配器 class 作为模板参数。
- allocate 方法需要作为分配器的一部分。
- 分配 允许return 用户定义类型的对象"acts like pointer to allocated data"。我们称它为my_pointer。
- my_pointer 应仅满足 NullablePointer 和 RandomAccessIterator 的要求。所有其他要求都是可选的。根据标准,我们可能无法将 my_pointer 转换为 CharT* 类型(另一个 basic_string 模板参数)因为它是可选的。
- 另一方面 const CharT* c_str() 方法应该作为标准的一部分来实现,所以我们必须知道如何进行这个转换.
第4条和第5条有冲突,不知如何解决。
希望你能帮我弄清楚。
谢谢!
标准中有几项要求始终确保转换是可能的,至少是间接的
给定basic_string<charT, traits, Allocator>
、the standard requires、charT
和allocator_traits<Allocator>::value_type
相等。
allocator_traits<Allocator>::pointer
is required 为 Allocator::pointer
或 Allocator::value_type*
.
在前一种情况下,给定一个Allocator::pointer
p
,*p
is required为Allocator::value_type&
.
在后一种情况下,一切都是微不足道的。
Allocator::pointer
is required to be a contiguous iterator,这需要,给定一个连续的迭代器 q
,*(q + n) == *(addressof(*q) + n)
给定一个Allocator
a
,a.allocate(n)
is required到return一个Allocator::pointer
.
将所有内容组合在一起,这意味着这总是正确的
template<typename charT, typename traits = /* ... */, typename Allocator = /* ... */>
class basic_string
{
typename std::allocator_traits<Allocator>::pointer _data;
// ...
public:
charT* c_str() { return std::addressof(*_data); }
// ...
};
其中 _data
可能存储先前调用 Allocator::allocate
的结果
最近想研究一下libstdc++源码(GCC 7.2),一头雾水。可能我错过了一些重要的东西,但我开始认为完全符合 C++ 标准的 basic_string class 是不可能实现的。
这是我遇到的一个问题。
- basic_string 应该能够接受自定义分配器 class 作为模板参数。
- allocate 方法需要作为分配器的一部分。
- 分配 允许return 用户定义类型的对象"acts like pointer to allocated data"。我们称它为my_pointer。
- my_pointer 应仅满足 NullablePointer 和 RandomAccessIterator 的要求。所有其他要求都是可选的。根据标准,我们可能无法将 my_pointer 转换为 CharT* 类型(另一个 basic_string 模板参数)因为它是可选的。
- 另一方面 const CharT* c_str() 方法应该作为标准的一部分来实现,所以我们必须知道如何进行这个转换.
第4条和第5条有冲突,不知如何解决。 希望你能帮我弄清楚。
谢谢!
标准中有几项要求始终确保转换是可能的,至少是间接的
给定
basic_string<charT, traits, Allocator>
、the standard requires、charT
和allocator_traits<Allocator>::value_type
相等。allocator_traits<Allocator>::pointer
is required 为Allocator::pointer
或Allocator::value_type*
.在前一种情况下,给定一个
Allocator::pointer
p
,*p
is required为Allocator::value_type&
.在后一种情况下,一切都是微不足道的。
Allocator::pointer
is required to be a contiguous iterator,这需要,给定一个连续的迭代器q
,*(q + n) == *(addressof(*q) + n)
给定一个
Allocator
a
,a.allocate(n)
is required到return一个Allocator::pointer
.
将所有内容组合在一起,这意味着这总是正确的
template<typename charT, typename traits = /* ... */, typename Allocator = /* ... */>
class basic_string
{
typename std::allocator_traits<Allocator>::pointer _data;
// ...
public:
charT* c_str() { return std::addressof(*_data); }
// ...
};
其中 _data
可能存储先前调用 Allocator::allocate