我正在编写一个分配器,它将对齐作为模板参数以及对齐:
template<typename T, std::align_val_t alignment>
class AlignedAllocator {
public:
using value_type = T;
using align_type = std::size_t;
constexpr AlignedAllocator() noexcept = default;
constexpr AlignedAllocator(const AlignedAllocator&) noexcept = default;
template<typename U> constexpr AlignedAllocator(const AlignedAllocator<U, alignment>&) noexcept {}
constexpr std::size_t align() noexcept
{
return static_cast<std::size_t>(alignment);
}
[[nodiscard]]
value_type* allocate(std::size_t n)
{
return reinterpret_cast<value_type*>(::operator new[](n, alignment));
}
void deallocate(value_type* ptr, std::size_t)
{
::operator delete[](ptr, alignment);
}
};
当我尝试使用std::allocator_traits
methed时,问题就来了rebind
,因为它似乎只能管理一个参数,即 type T
。这使得我的分配器与标准容器库不兼容:
std::vector<AlignedAllocator<int, std::align_val_t{64}>
不编译。一个出路是添加
template<typename U> {
struct rebind {
using other = AlignedAllocator<U, alignment>;
};
这使得代码可以编译。然而,该rebind
结构在 c++17 中已弃用,并在 c++20 中被删除。
问题
有什么建议可以让我的代码在不使用已弃用的功能的情况下工作吗?一种是使用对齐方式初始化分配器,但我想将此参数保留在类型中。
rebind
的成员std::allocator
已被删除,因为默认值适用于std::allocator
。这与您的分配器无关,分配器需要提供此结构才能满足分配器要求。[allocator.requirements.general]/18,我的重点:
rebind
您应该按照 的预期在分配器中提供std::allocator_traits
。