提问人:glades 提问时间:7/1/2023 更新时间:7/1/2023 访问量:33
如何将std::uses_allocator_construction_args扩展为构造函数参数列表?
How to expand std::uses_allocator_construction_args into constructor parameter list?
问:
我想创建一个类,该类可以为拥有和非拥有字符串类型(例如 或 )。在这两种情况下,虽然有内部数据结构要分配(向量),它需要一个分配器,但是在字符串的情况下,我想对内部数据结构使用与字符串相同的分配器,并让构造函数将此分配器转发到字符串对象。在string_view情况下,string_view 的构造函数不接受分配器,因此我必须专门化对构造函数的调用,以便不转发分配器,而是初始化为空。我可以接近,但我无法将元组解压缩到参数列表中,我该怎么办?Entity
std::string
std::string_view
Entity
uses_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;
}
答:
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
我想知道我怎么没有考虑使用复制构造函数,因为它无论如何都经过优化了..,谢谢!
上一个:推力执行策略中的内存池
评论