コードで次の宝石を発見しました (例は非常に単純化されていますが、ロジックは同じです)。
template <class T>
class garbage_bin
{
private:
garbage_bin<T>(void)
{
}
static garbage_bin<T>* pinstance;
public:
static garbage_bin<T>& instance()
{
if(pinstance == NULL)
{
pinstance = new garbage_bin<T>();
}
return *pinstance;
}
void empty()
{
for(size_t i=0; i<items.size(); i++)
{
free (items[i]);
}
}
void throwIn(T item)
{
items.push_back(item);
}
vector<T> items;
};
そしてコードのどこかに(これはほんの一例です...このようなものは何千もあります):
char* r = strdup(src);
garbage_bin<char*>::instance().throwIn(r);
その後、コードのどこかで、終了の直前に...
garbage_bin<char*>::instance().empty();
garbage_bin<molecules*>::instance().empty();
garbage_bin<CDatabaseUsers*>::instance().empty();
等々 ...
ご覧のとおり、これはガベージ ビン クラスを実装します。このクラスでは、あらゆる種類のオブジェクトを「投入」できます。後の段階でメモリ リークを回避するために、ガベージ ビンを「空」にします。しかし、ここで大きなボトルネックが発生します。これが適切に機能するためには、このガベージ ビンがインスタンス化されたすべてのクラスを把握して、それらを空にする必要があります...
私が考えていた最も直接的な解決策はtypeid
、インスタンス化の呼び出しのマップを作成し、名前に を割り当てることgarbage_bin<T>::instance()
ですが、古代のコンパイラはこのアプローチが気に入らないと判断しました。
明らかに、コードを検索してすべてのテンプレート化を見つけることができますが、疑問に思っています...これを行う簡単な方法はありますか?