2010-05-06 2 views
2

Каждого СТЛ контейнера взять аллокатор в качестве параметра:распределителя, без шаблона

template < class T, class Allocator = allocator<T> > class vector; 

Если вы написать свой собственный класс можно использовать собственный распределитель. Но можно ли написать собственный распределитель без использования шаблонов?

Например, написание этой функции не легко, если вы не можете использовать шаблоны

pointer allocate(size_type n, const_pointer = 0) { 
    void* p = std::malloc(n * sizeof(T)); 
    if (!p) 
     throw std::bad_alloc(); 
    return static_cast<pointer>(p); 
    } 

Потому что, как вы могли бы знать размер T?

+1

k, но это нерелевантно – Merni

ответ

2

Ну, если вы написали тот, который не был классом шаблона, он должен был быть только для одного типа. Просто замените T на какой тип вы хотите использовать распределитель.

Похоже на бессмысленное упражнение, поскольку на самом деле у вас есть доступные вам шаблоны.

+0

, но я нахожусь в системе с очень старым gcc-компилятором, и если я использую шаблоны, память перепуталась, память очень ограничена. – Merni

+0

Итак, ваш компилятор работает достаточно хорошо, чтобы компилировать и использовать STL, но недостаточно хорошо для компиляции и использования шаблонного пользовательского распределителя для этих контейнеров? Это кажется маловероятным. –

+2

@Merni: Это тот материал, который вы должны задать в своем вопросе. Что вы подразумеваете под памятью, все испортилось? – GManNickG

0

std::allocator сам является классом шаблона, поэтому, если вы хотите его заменить, вам необходимо использовать класс шаблона.

Теперь, как говорится, это довольно легко написать класс распределителя, направляет запросы о выделении к другому объекту:

class my_allocator 
{ 
public: 
    void *allocate(size_t size) { ... } 
} 

template <class T> 
class my_std_allocator 
{ 
public: 
    pointer allocate(size_t count, const void *hint) { return static_cast<pointer>(m_my_allocator->allocate(count*sizeof(T))); } 

private: 
    my_allocator * const m_my_allocator; 

} 
1

Если вы готовы написать аллокатор для одного класса, вы, вероятно, ... хотя это будет зависеть от контейнера, для которого вы хотите его использовать.

требуется Распределитель иметь этот метод:

template <class T> 
class Allocator 
{ 
public: 
    template <class U> 
    Allocator(const Allocator<U>& rhs); 
}; 

Почему? Если вы используете say, список, то вы не выделяете пространство для объекта T, скорее, в списке будет какая-то структура Node<T>, которая содержит один или два указателя на предыдущие/следующие узлы.

Поэтому, пройдя Allocator<T>, он построит , чтобы сделать собственные ассигнования.

Теперь, если вы думаете о контейнерах STL, это требование требует list, set и map. Я даже не уверен, что вы уйдете без vector и deque, и в любом случае вы не встретите концептуальных требований Allocator.

Смежные вопросы