C++ 查找实例化模板

标签 c++ templates

我刚刚在代码中发现了以下 gem (示例非常简化,但逻辑是相同的):

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 的 map 。调用实例化,并分配 garbage_bin<T>::instance()然而,一位古老的编译器认为他不喜欢这种方法。

显然,我可以通过搜索代码来找到所有的模板化,但我想知道......有没有更简单的方法来做到这一点?

最佳答案

垃圾桶!

class garbage_bin_base;

class garbage_bin_bin {
public:
    void throwIn(garbage_bin_base* rubbish) { items.push_back(rubbish); }
    void empty() { for (auto item: items) item->empty(); }
private:
    vector<garbage_bin_base*> items;
};

class garbage_bin_base {
public:
    virtual empty() = 0;
    garbage_bin_base() { garbage_bin_bin::instance().throwIn(this); }
};

template <typename T>
class garbage_bin : public garbage_bin_base {
};

关于C++ 查找实例化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834969/

相关文章:

c++ - 如何等待多个线程完成并重用它们?

c++ - 我不断收到 'no match for call to' 错误

c++ - 如何在C++中进行相互类

c++ - 从 GCC 可执行文件中剥离符号和 RTTI 文本

javascript - 一个 Controller 和多个带有 ui-router 的模板?

c++ - 如何使概念失败并显示自定义错误消息(C++ 20)

c++ - 如何为类型列表中的每种类型创建一个元素并将其添加到 C++ 中的 vector 中?

c++ - 替换常量 : when to use static constexpr and inline constexpr?

C++ 模板右值 Ctor 与 Const 引用 Ctor

c++ - g++ 模板错误或 VC 过于宽松?