【发布时间】:2012-04-09 03:50:46
【问题描述】:
我有一个看起来像这样的模板化容器类:
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 设置为零,实际上并没有触及大批。这对于 POD 样式的 ItemTypes 非常有用,但对于例如文件句柄类型。
我的问题是,有没有办法使用 SFINAE 或类似方法让编译器在编译时决定将 Clear() 设为 FastClear() 的同义词是安全的,即当 ItemType 有一个微不足道的析构函数时?这样调用代码就不必记住调用 FastClear() 而不是 Clear 来获得加速,它会自动工作。
另外,只是为了让事情变得更加困难......我希望能够在不添加对 Boost/TR1/C++11 的依赖项的情况下做到这一点。 (所以调用 is_pod() 或 has_trivial_destructor() 对我来说不是很好的选择)
【问题讨论】: