uninitialized_X 使用分配器构造函数的函数?
uninitialized_X functions that use the allocator constructor?
是否有 uninitialized_value_construct
的版本使用分配器来构建元素而不是放置 new
?
下面是uninitialized_value_construct
的原型实现;但是我正在寻找一个传递分配器的地方,这样我就可以使用行 alloc.construct(std::addressof(*current))
而不是 ::new (std::addressof(*current))
.
template<class ForwardIt>
void uninitialized_value_construct(ForwardIt first, ForwardIt last)
{
using Value = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try {
for (; current != last; ++current) {
::new (static_cast<void*>(std::addressof(*current))) Value();
}
} catch (...) {
std::destroy(first, current);
throw;
}
}
在C++20中,有uninitialized_construct_using_allocator,但不清楚它的用途或使用方法。
编辑: 在与@NicolBolas 交谈后,我最终实现了这对功能(我希望它们在 std::
中)。为了我的需要(并且不失一般性,我将对其他 uninitialized_X
函数执行此操作。
template<class Alloc, class ForwardIt, class Size, class AT = typename std::allocator_traits<Alloc>>
ForwardIt uninitialized_value_construct_n(Alloc& a, ForwardIt first, Size n){
using T = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try{
for(; n > 0; (void) ++current, --n)
AT::construct(a, std::addressof(*current), T());
// ::new (static_cast<void*>(std::addressof(*current))) T();
return current;
}catch(...){destroy(a, first, current); throw;}
}
template<class Alloc, class ForwardIt, typename AT = typename std::allocator_traits<Alloc> >
void destroy(Alloc& a, ForwardIt first, ForwardIt last){
for(; first != last; ++first)
AT::destroy(a, std::addressof(*first));
// destroy_at(std::addressof(*first));
}
遗憾的是,uninitialized_construct
没有采用分配器的远程版本。
至于 uninitialized_construct_using_allocator
的作用,它通过分配器构造具有给定参数的给定类型的单个对象。这可能 看起来 做起来微不足道 (std::allocator_traits<Alloc>::construct(t, alloc, std::forward<Args>(args)...)
),但这样做的方式是分配器将正确传播到 scoped_allocator
所使用的T
。这需要一个bunch of techniques 不太为人所知,也不容易理解,所以有一个特定的功能来做。
是否有 uninitialized_value_construct
的版本使用分配器来构建元素而不是放置 new
?
下面是uninitialized_value_construct
的原型实现;但是我正在寻找一个传递分配器的地方,这样我就可以使用行 alloc.construct(std::addressof(*current))
而不是 ::new (std::addressof(*current))
.
template<class ForwardIt>
void uninitialized_value_construct(ForwardIt first, ForwardIt last)
{
using Value = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try {
for (; current != last; ++current) {
::new (static_cast<void*>(std::addressof(*current))) Value();
}
} catch (...) {
std::destroy(first, current);
throw;
}
}
在C++20中,有uninitialized_construct_using_allocator,但不清楚它的用途或使用方法。
编辑: 在与@NicolBolas 交谈后,我最终实现了这对功能(我希望它们在 std::
中)。为了我的需要(并且不失一般性,我将对其他 uninitialized_X
函数执行此操作。
template<class Alloc, class ForwardIt, class Size, class AT = typename std::allocator_traits<Alloc>>
ForwardIt uninitialized_value_construct_n(Alloc& a, ForwardIt first, Size n){
using T = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try{
for(; n > 0; (void) ++current, --n)
AT::construct(a, std::addressof(*current), T());
// ::new (static_cast<void*>(std::addressof(*current))) T();
return current;
}catch(...){destroy(a, first, current); throw;}
}
template<class Alloc, class ForwardIt, typename AT = typename std::allocator_traits<Alloc> >
void destroy(Alloc& a, ForwardIt first, ForwardIt last){
for(; first != last; ++first)
AT::destroy(a, std::addressof(*first));
// destroy_at(std::addressof(*first));
}
遗憾的是,uninitialized_construct
没有采用分配器的远程版本。
至于 uninitialized_construct_using_allocator
的作用,它通过分配器构造具有给定参数的给定类型的单个对象。这可能 看起来 做起来微不足道 (std::allocator_traits<Alloc>::construct(t, alloc, std::forward<Args>(args)...)
),但这样做的方式是分配器将正确传播到 scoped_allocator
所使用的T
。这需要一个bunch of techniques 不太为人所知,也不容易理解,所以有一个特定的功能来做。