如何存储用于分配不同类型的自定义分配器的状态

How to store a state of custom allocator used for allocation of different types

在需要使用自定义 stateful 分配器的情况下,存储 state 的惯用方式是什么,如果状态应该用来分配不同类型的对象?例如。如果需要一个 分配器感知 对象,它使用不同类型的数据结构,例如:

struct Foo
{
    std::vector<int> ints;
    std::vector<double> doubles;
    void bar() { std::vector<std::string> strs; }
}

我尝试了两种解决方案:
(1)

template<typename Alloc>
struct Foo
{
    Foo(const Alloc& alloc) : alloc(alloc), ints(alloc), doubles(alloc) {}

    Alloc alloc;
    std::vector<int, typename std::allocator_traits<Alloc>::template rebind_alloc<int>> ints;
    std::vector<double, typename std::allocator_traits<Alloc>::template rebind_alloc<double>> doubles;
    void bar() { std::vector<std::string, typename std::allocator_traits<Alloc>::template rebind_alloc<std::string>> strs(alloc); }
};

custom_allocator<char> alloc(state); // any type, will be rebound
Foo<custom_allocator<char>> foo(alloc);

假设分配器的状态很容易复制,那么这个解决方案很好,但是编写重新绑定机制(typename allocator_traits::template rebind)以及我必须指定(某些)类型(char) 让我很头疼。

(2)

template<template<typename> typename Alloc>
struct Foo
{
    struct dummy_t{};

    Foo(const Alloc<dummy_t>& alloc) : alloc(alloc), ints(alloc), doubles(alloc) {}

    Alloc<dummy_t> alloc;
    std::vector<int, Alloc<int>> ints;
    std::vector<double, Alloc<double>> doubles;
    void bar() { std::vector<std::string, Alloc<std::string>> strs(alloc); }
};

custom_allocator<char> alloc(state); // any type, will be rebound, or
custom_allocator alloc2(state); // if I make <T = char> in my allocator implementation
Foo<custom_allocator> foo(alloc);

声明噪声似乎更好,但与 STL 的外观有些不同(因为它接受特定的分配器,而 (2) 接受分配器模板)。

理想情况下,我想要一个带有模板 construct 的单个分配器(即非模板),因为它不需要任何 rebinding/conversions,但遗憾的是,STL 容器不接受。

我是否遗漏了一些明显的东西,或者这些((1)或(2))是合理的方式?

编辑: 在我的建议中,分配器的状态实际上不是在向量之间共享,而是被复制,但我对此很好,因为在我的问题中,状态是不可变的。

也许你可以使用 pmr。

#include <vector>
#include <memory_resource>

struct foo {
    std::pmr::memory_resource& mem {*std::pmr::get_default_resource()};
    std::pmr::vector<int> vi{&mem};
    std::pmr::vector<double> vd{&mem};
};