Ich habe einen Templat-Container-Klasse, die etwa wie folgt aussieht:Wie triviale Destruktor zur Kompilierzeit zu erkennen?
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;
};
Wie Sie die Clear() sehen Methode jedes Element in dem Behälter in den Grundzustand zurücksetzt, die für Typen, wo beispielsweise notwendig ist, Die einzelnen Elemente haben dynamisch interne Ressourcen zugewiesen, die der Clear() -Aufruf freigeben soll.
Es gibt auch die FastClear(), die, wie der Name schon sagt, schneller ist (O (1) statt O (N)), weil sie einfach _numValidItems auf Null setzt und keines der Elemente tatsächlich berührt das Array. Dies ist großartig für POD-Style ItemTypes, aber nicht so gut für z.B. Datei-Handle-Typen.
Meine Frage ist, gibt es eine Möglichkeit, SFINAE oder ähnliches zu verwenden, um den Compiler zur Kompilierzeit zu entscheiden, dass es sicher ist, Clear() ein Synonym für FastClear() zu machen, d.h. wenn ItemType einen trivialen Destruktor hat? Auf diese Weise müsste sich der aufrufende Code nicht daran erinnern, FastClear() anstelle von Clear aufzurufen, um eine Beschleunigung zu erhalten, dies würde automatisch funktionieren.
Auch, nur um die Dinge schwieriger zu machen ... Ich würde gerne in der Lage sein, dies zu tun, ohne eine Abhängigkeit zu Boost/TR1/C++ 11 hinzuzufügen. (So nennt is_pod() oder has_trivial_destructor() nicht gute Möglichkeiten für mich)