首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中类模板的自动编译时工厂注册

在C++中,类模板的自动编译时工厂注册是一种编程技巧,它允许在编译时自动注册类模板的实例,而无需手动创建和管理工厂函数。这种技术可以简化代码,减少错误,并提高代码的可维护性。

以下是一个简单的示例,说明如何使用类模板的自动编译时工厂注册:

代码语言:cpp
复制
#include<iostream>
#include <unordered_map>
#include<string>

template<typename T>
class Registry {
public:
    static Registry& instance() {
        static Registry instance;
        return instance;
    }

    void registerClass(const std::string& name) {
        factories_[name] = []() { return new T; };
    }

    T* create(const std::string& name) {
        auto it = factories_.find(name);
        if (it != factories_.end()) {
            return it->second();
        }
        return nullptr;
    }

private:
    Registry() {}
    Registry(const Registry&) = delete;
    Registry& operator=(const Registry&) = delete;

    std::unordered_map<std::string, std::function<T*()>> factories_;
};

class Base {
public:
    virtual ~Base() {}
};

template<typename T>
class Register : public Base {
public:
    Register(const std::string& name) {
        Registry<Base>::instance().registerClass(name);
    }
};

class A : public Base {
public:
    A() { std::cout << "A created"<< std::endl; }
};

class B : public Base {
public:
    B() { std::cout << "B created"<< std::endl; }
};

Register<A> reg_a("A");
Register<B> reg_b("B");

int main() {
    Base* a = Registry<Base>::instance().create("A");
    Base* b = Registry<Base>::instance().create("B");
    delete a;
    delete b;
    return 0;
}

在这个示例中,我们定义了一个名为Registry的模板类,它使用std::unordered_map来存储工厂函数。我们还定义了一个名为Register的模板类,它在构造时将类名注册到Registry中。

main函数中,我们使用Registry来创建AB的实例。这些实例是通过自动编译时工厂注册创建的,而无需手动创建和管理工厂函数。

这种技术可以在多种场景中使用,例如插件系统、工厂方法模式等。它可以帮助开发人员更轻松地管理和扩展代码,同时减少错误和提高代码的可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的结果

领券