基于singelton跟踪每个创建的模板

时间:2016-09-13 17:23:01

标签: c++ templates generics singleton

对于我的项目,我需要创建泛型类型的单例。 这些单例管理 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实例。

1 个答案:

答案 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指针并避免不必要的检查。