C++ трюк с шаблоном

Модератор: Модераторы разделов

_Tarik_
Сообщения: 22
ОС: Gentoo linux

C++ трюк с шаблоном

Сообщение _Tarik_ »

Имеется шаблонный класс-контейнер, тип элементов которого задаётся в шаблоне, при удалении объекта этого класса хотелось бы реализовать в деструкторе удаление элементов если это указатели. Т.е. проблема в том, что надо в зависимости от типа вызывать delete или нет. Кроме макросов ни чего в голову не лезет, но что-то подсказывает, что можно такое осуществить через шаблоны..
Спасибо сказали:
Аватара пользователя
Sceptik
Сообщения: 84
ОС: Debian

Re: C++ трюк с шаблоном

Сообщение Sceptik »

_Tarik_
частичная специализация шаблона?
Мы должны построить мирное и свободное общество, где уважают права и свободы, где нет угнетённых, обиженных и несправедливо обделённых, где нет места ненависти и крови... построить его любой ценой.
Спасибо сказали:
_Tarik_
Сообщения: 22
ОС: Gentoo linux

Re: C++ трюк с шаблоном

Сообщение _Tarik_ »

Уже помогли на другом форуме.. Как всегда всё оказалось просто и изящно :). Просто делается две функции с шаблоном:

Код: Выделить всё

template<class T>
void cleanup(T value)
{}
template<class T>
void cleanup(T* value)
{
  delete value;
}
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ трюк с шаблоном

Сообщение oav »

_Tarik_ писал(а):
15.02.2007 19:59
Имеется шаблонный класс-контейнер, тип элементов которого задаётся в шаблоне, при удалении объекта этого класса хотелось бы реализовать в деструкторе удаление элементов если это указатели. Т.е. проблема в том, что надо в зависимости от типа вызывать delete или нет. Кроме макросов ни чего в голову не лезет, но что-то подсказывает, что можно такое осуществить через шаблоны..

Я бы сделал более гибко, чем тебе предложили выше, т.к. завтра легко могут появиться новые требования:

завел второй параметр шаблона - политика удаления. Реализовал бы несколько политик. Политики по-умолчанию - выбор через type_traits конкретной реализации политики, для указателей - одна, если не указатель - другая. В другом месте кода можно просто явно указать политику забив на автоматический выбор.

зы. если надо вырьировать только удаление - то можно еще о smart pointers подумать, если не мешает накладные расходы на распоковку/упаковку самих элементов.
Спасибо сказали:
_Tarik_
Сообщения: 22
ОС: Gentoo linux

Re: C++ трюк с шаблоном

Сообщение _Tarik_ »

oav, я не использую boost, потому type_traits мне не подойдёт, а это в самый раз..
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ трюк с шаблоном

Сообщение oav »

_Tarik_ писал(а):
16.02.2007 11:06
oav, я не использую boost, потому type_traits мне не подойдёт, а это в самый раз..

type_traits для поинторов/непоинторов сделать - строчек 15 кода. Зато в будущем такое решение будет легко масштабироваться.
Все есессно имхо - вариант с перегруженной функцией вполне валидный.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: C++ трюк с шаблоном

Сообщение v04bvs »

Я может крамольную мысль выскажу, но указатели удалять нельзя :) Ими надо управлять через smart pointers, как впрочем и другими ресурсами. Тогда этой проблемы не будет by design. А то потом замучаешься понимать, почему оно память портит. А оно оказывается пытается указатель на статический объект удалять :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ трюк с шаблоном

Сообщение oav »

v04bvs писал(а):
16.02.2007 11:43
Я может крамольную мысль выскажу, но указатели удалять нельзя :) Ими надо управлять через smart pointers, как впрочем и другими ресурсами. Тогда этой проблемы не будет by design. А то потом замучаешься понимать, почему оно память портит. А оно оказывается пытается указатель на статический объект удалять :)

Смотри выше ;-)
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: C++ трюк с шаблоном

Сообщение Женя Подсыпальников »

Совет с кодом - интересный:

- с одной стороны,
чтобы вызвать вторую функцию -
надобно передать адрес переменной типа Т
(и удалится совсем не указатель, а адрес на него...)

- с другой стороны,
если я знаю что мне нужна вторая функция,
то нет и задачи

:)

Разные или параметрированные шаблоны
(ведь и указатели могут быть не моими) -
сдаётся мне, более спокойное решение... :)
Пойдём на рыбалку !
Спасибо сказали: