你的代码看起来类似C的非常不很C++ - 样,但如果你实际上可以使用C++ 11的全部功能,那么我会结合使用std::function
,lambda,std::unique_ptr
和std::map
。
lambda表达式可以包装构造没有你不必编写单独的包装函数,std::function
允许将lambda表达式存储在地图,std::unique_ptr
消除了许多存储器管理错误,并std::map
执行从字符串初始化剂功能的实际映射。
下面是一个完整的例子:
#include <functional>
#include <string>
#include <memory>
#include <map>
#include <iostream>
struct IREGISTRY {
virtual ~IREGISTRY() {}
virtual void print() = 0;
};
struct REGISTRY_XML : IREGISTRY { void print() override { std::cout << "XML\n"; } };
struct REGISTRY_INI : IREGISTRY { void print() override { std::cout << "INI\n"; } };
struct REGISTRY_JSON : IREGISTRY { void print() override { std::cout << "JSON\n"; } };
int main()
{
std::map<std::string, std::function<std::unique_ptr<IREGISTRY>()>> const registry_list = {
{ "xml", []() { return std::make_unique<REGISTRY_XML>(); } },
{ "ini", []() { return std::make_unique<REGISTRY_INI>(); } },
{ "json", []() { return std::make_unique<REGISTRY_JSON>(); } },
};
auto const initializer_iter = registry_list.find("xml");
if (initializer_iter != registry_list.end())
{
auto const initializer = initializer_iter->second;
auto const registry_ptr = initializer();
registry_ptr->print();
}
}
你可以使用免费的功能或静态成员函数,而不是构造函数。 – songyuanyao
是的,使用工厂/生成器功能会更简单,更清洁。 – benzeno