I am implementing a container, that following the example of std::vector, has a private unitialize_construct.
template<class... Args>
auto uninitialized_construct(Args&&... args){
    typename array::element_ptr cur = this->data();
    for(size_type n = this->num_elements(); n > 0; --n, ++cur)
            alloc_traits::construct(allocator_, std::addressof(*cur), std::forward<Args>(args)...);
    }catch(...){destroy(cur); throw;}
}
I though that, for generic programming purposes, it would be better to use an algorithm instead of a raw loop. It turns out that the standard has std::unitialized_fill_n that does a placement new and effectively it is very similar.
https://en.cppreference.com/w/cpp/memory/uninitialized_fill_n
However, there is a big problem, std::uninitialized_fill_n doesn't have a variadic argument, and therefore I cannot forward args....
a) Why is it so? Is there another variant of uninitialized_fill_n that can forward it construction arguments?
b) If not, am I supposed to call unitialized_fill_n(data, size, value_type(std::forward<Args>(args)...))?
To reiterate, I was expecting to be able to say unitialized_fill_n(data, size, std::forward<Args>(args)...).
Aucun commentaire:
Enregistrer un commentaire