пятница, 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 комментариев:

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

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

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

    Почему?

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

    ОтветитьУдалить