Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Февраль 22, 2012, 14:59



Название: ALLOC
Отправлено: Igors от Февраль 22, 2012, 14:59
Добрый день

Есть такая макруха
Код
C++ (Qt)
#define ALLOC(allocator, a) ((a *) allocator.Alloc(sizeof(a)))
 
Как бы вместо нее сделать в стиле плюсов?

Спасибо


Название: Re: ALLOC
Отправлено: BRE от Февраль 22, 2012, 15:02
Как бы вместо нее сделать в стиле плюсов?
В смысле как определить свой оператор new?


Название: Re: ALLOC
Отправлено: Igors от Февраль 22, 2012, 15:14
В смысле как определить свой оператор new?
Нет, new я сам потом (может) буду делать. Здесь хочется иметь напр нормальный template вместо древнего macro


Название: Re: ALLOC
Отправлено: Alex Custov от Февраль 22, 2012, 16:01
Код
C++ (Qt)
class Allocator
{
   public:
       void *Alloc(int s)
       {
           return malloc(s);
       }
       ...
};
 
template <typename T>
T* alloc(Allocator &alc)
{
   return reinterpret_cast<T *>(alc.Alloc(sizeof(T)));
}
 
int main()
{
   Allocator a;
 
   void *p = alloc<int>(a);
 
   std::cout << p << std::endl;
 
   return 0;
}
 

Типа такого? const можно добавить по вкусу.


Название: Re: ALLOC
Отправлено: Igors от Февраль 22, 2012, 16:14
Типа такого? const можно добавить по вкусу.
Спасибо, такой возможности я не рассматривал. А можно как-то без "перекладной" ф-ции (alloc) которая (на мой вкус) не украшает? Хотелось бы так

Код
C++ (Qt)
MyStruct * s = allocator.Alloc();
 
Но так просто не выходит  :)


Название: Re: ALLOC
Отправлено: Alex Custov от Февраль 22, 2012, 16:24
а аллокатор у тебя свой написан? Судя по всему да, тогда его просто нужно сделать шаблонным, как стандартный allocator из <memory> (или сделать шаблонным метод Alloc(), что вероятно лучше), и можно будет писать

Код
C++ (Qt)
class Allocator
{
   public:
       template<typename T>
       T *Alloc()
       {
           return new T;
       }
       ...
};
 
MyStruct * s = allocator.Alloc<MyStruct>();
 

Без кода самого аллокатора сказать сложно.


Название: Re: ALLOC
Отправлено: Igors от Февраль 22, 2012, 16:50
Да, кастомный аллокатор
Код
C++ (Qt)
MyStruct * s = allocator.Alloc<MyStruct>();
 
Так меня вполне устраивает. Совсем просто, но не сообразил  :)
Спасибо


Название: Re: ALLOC
Отправлено: andrew.k от Февраль 22, 2012, 16:53
Абстрактная фабрика (http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования))


Название: Re: ALLOC
Отправлено: GreatSnake от Февраль 22, 2012, 17:14
Абстрактная фабрика (http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования))
Причём здесь абстракция ???


Название: Re: ALLOC
Отправлено: andrew.k от Февраль 22, 2012, 17:15
Абстрактная фабрика (http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования))
Причём здесь абстракция ???
ХЗ )
Может подойдет для его задачи.


Название: Re: ALLOC
Отправлено: GreatSnake от Февраль 22, 2012, 17:16
Абстрактная фабрика (http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования))
Причём здесь абстракция ???
ХЗ )
Может подойдет для его задачи.
Не подойдёт.
Уже начал отмечать 23 февраля? :)


Название: Re: ALLOC
Отправлено: andrew.k от Февраль 22, 2012, 17:18
Абстрактная фабрика (http://ru.wikipedia.org/wiki/Абстрактная_фабрика_(шаблон_проектирования))
Причём здесь абстракция ???
ХЗ )
Может подойдет для его задачи.
Не подойдёт.
Уже начал отмечать 23 февраля? :)
Ну и ладно) Может и начал)