나는 이런 식으로 뭔가를 보이는 템플릿 컨테이너 클래스가 있습니다컴파일 타임에 사소한 소멸자를 감지하는 방법은 무엇입니까?
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() 호출이 해제되기를 원하는 내부 리소스가 동적으로 할당됩니다.
FastClear()도 이름에서 알 수 있듯이 단순히 _numValidItems를 0으로 설정하고 실제로는 아무 항목도 건드리지 않으므로 더 빠릅니다 (O (N) 대신 O (1)). 배열 이것은 POD 스타일의 ItemType에 적합하지만 예를 들어 그렇게 좋지는 않습니다. 파일 핸들 유형.
내 질문은 SFINAE 또는 유사한 컴파일러에서 ClearClear()에 대한 동의어, 즉 ItemType에 사소한 소멸자가있는 것이 안전하다는 것을 컴파일 타임에 결정할 수있는 방법이 있습니까? 그런 식으로 호출 코드는 Clear 대신 FastClear()를 호출하여 스피드 업을 얻는 것을 기억할 필요가 없으므로 자동으로 작동합니다.
또한, 더 어렵게 만들기 위해서 ... Boost/TR1/C++ 11에 의존성을 추가하지 않고도이 작업을 수행하고 싶습니다.