对于我的项目,我需要创建泛型类型的单例。 这些单例管理 std :: map 中的泛型类型,ID为Object。 这是我用过的代码:
template <typename tComponent>
class InternalComponent {
public:
static InternalComponent& getInstance() {
static InternalComponent s_result;
return s_result;
}
void add(const tComponent& component, int id) {
m_components[id] = component;
}
void remove(int id) {
std::lock_guard<std::mutex> lock(m_mutex);
auto it = m_components.find(id);
if (it == m_components.end()) {
throw std::runtime_error("Component can't be found.");
}
m_components.erase(it, m_components.end());
}
void replace(const tComponent& component, int id) {
auto it = m_components.find(id);
if (it == m_components.end()) {
throw std::runtime_error("Component can't be found.");
}
m_components[id] = component;
}
tComponent* get(int id) {
return &m_components[id];
}
private:
InternalComponent() {};
InternalComponent(const InternalComponent&);
InternalComponent & operator = (const InternalComponent &);
std::mutex m_mutex;
std::map<int, tComponent> m_components;
};
为了删除每个单例中具有特定ID的所有组件,我必须跟踪每个单例的创建实例。 在这一点上,我被困住了。
第一个问题是无法保存到 vector 的泛型类型。 我会用Baseclass绕过它并从中派生出InternalComponent。
但是我仍然无法保存对矢量的引用。
此外,我不确定如何首次创建单例,而不在每个getInstance调用中使用if语句,以避免在我创建的单例列表中重复条目。
我的最后一个问题是:如何在单个列表中管理每个创建的InternalComponent实例。
答案 0 :(得分:0)
我想出了如何跟踪我创建的所有基于模板的单例。
#include <iostream>
#include <vector>
class Base {
public:
virtual void delete(int id) = 0;
};
std::vector<Base*> test;
template<typename T>
class S : public Base
{
public:
void delete(int id) override {
//delete the component
};
static S& getInstance()
{
static S instance;
return instance;
}
private:
S() {
test.push_back(this);
};
public:
S(S const&) = delete;
void operator=(S const&) = delete;
};
int main()
{
S<int>::getInstance();
S<char>::getInstance();
S<char>::getInstance();
for (auto s : test) {
s->delete(666);
}
exit(0);
}
我使用抽象类稍后将基于模板的类存储在向量中。该类提供了以后需要的功能。构造函数只被调用一次,这允许我存储this指针并避免不必要的检查。