У меня есть шаблонный класс контейнера, который выглядит примерно так:Как определить тривиальный деструктор во время компиляции?
template <class ItemType> class MyContainer
{
public:
[... various methods omitted for brevity...]
void Clear()
{
ItemType defaultItem;
for (int i=0; i<_numValidItems; i++) _itemArray[i] = defaultItem;
_numValidItems = 0;
}
void FastClear()
{
_numValidItems = 0;
}
private:
int _numValidItems;
ItemType * _itemArray;
};
Как вы можете видеть, Clear() метод сбрасывает каждый элемент в контейнере в состояние по умолчанию, которое необходимо для типов где например отдельные элементы динамически выделяют внутренние ресурсы, которые я хочу, чтобы освободить вызов Clear().
Существует также FastClear(), который, как следует из названия, быстрее (O (1) вместо O (N)), потому что он просто устанавливает _numValidItems в ноль и на самом деле не затрагивает ни один из элементов в массив. Это отлично подходит для ItemTyp-стиля в стиле POD, но не так хорошо, например. типы файлов.
Мой вопрос в том, есть ли способ использовать SFINAE или подобное, чтобы заставить компилятор решить во время компиляции, что безопасно сделать Clear() синоним для FastClear(), то есть когда ItemType имеет тривиальный деструктор? Таким образом, вызывающему коду не нужно было бы переписывать FastClear() вместо Clear, чтобы получить ускорение, оно будет работать автоматически.
Также, чтобы усложнить ситуацию ... Я хотел бы иметь возможность сделать это, не добавляя зависимости от Boost/TR1/C++ 11. (Поэтому вызов is_pod() или has_trivial_destructor() не являются хорошие варианты для меня)