你的代碼看起來類似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