пятница, 23 октября 2009 г.

Useful templates

В дополнение к предыдущему сообщению ещё пара полезных шаблонов:

//Безопасное удаление
template<typename T>
inline void SafeDelete( T*& p )
{
// Проверка, что тип полностью определен
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
// проверять p на равенство нулю не нужно, т.к. стандарт
// гарантирует корректную работу delete
delete p;
p = NULL;
}
Если нет запрета на использование boost, то лучше использовать boost::checked_delete.

// Безопасное удаление через Release
template<typename T, typename D>
inline void SafeRelease( T*& p, D d )
{
if ( p != NULL ) {
(p->*d)();
p = NULL;
}
}
template<typename T>
inline void SafeRelease( T*& p)
{
return SafeRelease( p, &T::Release );
}


UPD:22окт добавлена проверка на то, что тип является полностью определенным.

5 коммент.:

Игорь Говоров комментирует...

Я тоже себе когда-то писал такой же точно SafeRelease, и даже назвал его точно также (сказалось влияние Microsoft DirectX SDK, в котором вовсю использовался макрос с таким названием).
Только потом в него добавил проверку наподобие бустовской на то, является ли тип complete, после пары случаев когда на это напоролся.

Игорь Говоров комментирует...

В предыдущем сообщении имелась ввиду проверка для SafeDelete конечно же.

jia3ep комментирует...

Спасибо за замечание, обновил сообщение.

Begemot комментирует...

>>Если нет запрета на использование boost, то лучше использовать boost::checked_delete.

Почему?

jia3ep комментирует...

Чтобы не изобретать велосипед. Лучше в своем шаблоне написать checked_delete вместо двух строк с большим комментарием зачем они там.