У меня есть собственный распределитель, экземпляры которого разделяют буфер памяти типа TrivialSpace
:
class TrivialSpace
{
public:
uint8_t * Allocate(std::size_t memory_size)
{
...
return ptr_to_mem;
}
...
};
template <class T>
class TrivialAllocator
{
public:
using value_type = T;
TrivialAllocator(TrivialSpace & space) : m_space(space)
{
}
template <class Q>
TrivialAllocator(const TrivialAllocator<Q> & other) : m_space(other.m_space)
{
}
T * allocate(std::size_t n)
{
return reinterpret_cast<T*>(m_space.Allocate(n * sizeof(T)));
}
void deallocate(T* p, std::size_t n)
{
}
private:
TrivialSpace & m_space;
template <class Q>
friend class TestAllocator;
};
и структуру, содержащую std::string
и std::vector
:
using String = std::basic_string<char, std::char_traits<char>, TrivialAllocator<char>>;
template <class T>
using Vector = std::vector<T, TrivialAllocator<T>>;
struct A
{
String a;
Vector<int> b;
Vector<String> c;
};
1) Как правильно создать экземпляр структуры A
my TrivialAllocator
?
2) И как заставить код работать с TrivialAllocator
и std::allocator
? Когда типы полей определены, как указано выше или следующим образом (в зависимости от некоторых #ifdef
, вероятно):
using String = std::string;
template <class T>
using Vector = std::vector<T>;
Моя идея состояла в том, чтобы передать экземпляр Allocator
конструктору структуры, но это не так Ясно, какую специализацию Allocator
я должен пройти - Allocator<char>
, Allocator<int>
или что-то еще.