gpt4 book ai didi

C++ 查找实例化模板

转载 作者:行者123 更新时间:2023-11-28 07:18:46 25 4
gpt4 key购买 nike

我刚刚在代码中发现了以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com