У меня есть шаблонный класс контейнера, который выглядит примерно так:
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 в ноль и фактически не касается ни одного из элементов в массив. Это отлично подходит для ItemTypes в стиле POD, но не так хорошо, например, для типы файловых дескрипторов.
У меня вопрос: есть ли способ использовать SFINAE или аналогичный, чтобы компилятор во время компиляции решал, что безопасно сделать Clear () синонимом FastClear (), т. Е. Когда ItemType имеет тривиальный деструктор? Таким образом, вызывающий код не должен был бы забывать вызывать FastClear () вместо Clear для ускорения, он будет работать автоматически.
Кроме того, просто чтобы сделать вещи более сложными ... Я бы хотел сделать это без добавления зависимости в Boost / TR1 / C ++ 11. (поэтому вызов is_pod () или has_trivial_destructor () для меня не подходит)