在C++中,类模板的自动编译时工厂注册是一种编程技巧,它允许在编译时自动注册类模板的实例,而无需手动创建和管理工厂函数。这种技术可以简化代码,减少错误,并提高代码的可维护性。
以下是一个简单的示例,说明如何使用类模板的自动编译时工厂注册:
#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
来创建A
和B
的实例。这些实例是通过自动编译时工厂注册创建的,而无需手动创建和管理工厂函数。
这种技术可以在多种场景中使用,例如插件系统、工厂方法模式等。它可以帮助开发人员更轻松地管理和扩展代码,同时减少错误和提高代码的可维护性。
没有搜到相关的结果
领取专属 10元无门槛券
手把手带您无忧上云