如何将std::uses_allocator_construction_args扩展为构造函数参数列表?

How to expand std::uses_allocator_construction_args into constructor parameter list?

提问人:glades 提问时间:7/1/2023 更新时间:7/1/2023 访问量:33

问:

我想创建一个类,该类可以为拥有和非拥有字符串类型(例如 或 )。在这两种情况下,虽然有内部数据结构要分配(向量),它需要一个分配器,但是在字符串的情况下,我想对内部数据结构使用与字符串相同的分配器,并让构造函数将此分配器转发到字符串对象。在string_view情况下,string_view 的构造函数不接受分配器,因此我必须专门化对构造函数的调用,以便不转发分配器,而是初始化为空。我可以接近,但我无法将元组解压缩到参数列表中,我该怎么办?Entitystd::stringstd::string_viewEntityuses_allocator_construction_args

这是我所拥有和想做的:

演示

#include <iostream>
#include <vector>
#include <string>
#include <string_view>

template <typename Allocator>
struct view_adapter {
    using string_type = std::string_view;
    using allocator_type = Allocator;
};

template <typename StringType>
struct string_type_of_or {
    using type = StringType;
};

template <typename Allocator>
struct string_type_of_or<view_adapter<Allocator>> {
    using type = view_adapter<Allocator>::string_type;
};


template <typename StringType>
struct Entity {
    using allocator_type = StringType::allocator_type;
    using string_type = string_type_of_or<StringType>::type;

    Entity(allocator_type allocator = {})
        : vec{ allocator }
        , str{ uses_allocator_construction_args<StringType>(allocator)... } // <---- How to write this?
    {}

    StringType str;
    std::vector<StringType,
        typename std::allocator_traits<allocator_type>::template rebind_alloc<StringType>> vec;
};


int main() {
    Entity<std::string> my_val;
    Entity<view_adapter<std::allocator<std::string_view::value_type>>> my_view;
}
C++ 模板 分配器

评论


答:

2赞 Artyer 7/1/2023 #1

使用 std::make_obj_using_allocator<T>

https://godbolt.org/z/sTffGn1ez

    Entity(allocator_type allocator = {})
        : vec{ allocator }
        , str( std::make_obj_using_allocator<string_type>(allocator) )
    {}

评论

0赞 glades 7/1/2023
我想知道我怎么没有考虑使用复制构造函数,因为它无论如何都经过优化了..,谢谢!