IocContainer.h
#pragma once
#include<map>
#include<string>
#include<functional>
#include<memory>
#include<stdexcept>
template<class T>
class IocContainer {
public:
IocContainer(void) {};
~IocContainer() {};
template<class Drived>
void RegisterType(std::string key) {
std::function<T* ()> function = [] {return new Drived(); };
RegisterType(key, function);
}
T* Resolve(std::string key) {
if (m_createMap.find(key) == m_createMap.end())
{
return nullptr;
}
std::function<T* ()> function = m_createMap[key];
return function();
}
std::shared_ptr<T> ResolveShared(std::string key) {
T* ptr = Resolve(key);
return std::shared_ptr<T>(ptr);
}
private:
void RegisterType(std::string key, std::function<T* ()> creator) {
if (m_createMap.find(key)!= m_createMap.end())
{
throw std::invalid_argument("已经存在");
}
m_createMap.emplace(key, creator);
}
private:
std::map<std::string, std::function<T* ()>> m_createMap;
};
```
## mian.cpp
```
#include<iostream>
#include<string>
#include "IocContainer.h"
#include<memory>
#include<vld.h>
struct ICar
{
virtual void run(std::string str) = 0;
};
struct BaoMa:ICar
{
virtual void run(std::string str) {
std::cout << "BaoMa:" << str << std::endl;
}
};
struct BYD :ICar
{
virtual void run(std::string str) {
std::cout << "BYD:" << str << std::endl;
}
};
int main(int argc, char** argv) {
IocContainer<ICar> cars;
cars.RegisterType<BaoMa>("baoma");
cars.RegisterType<BYD>("byd");
cars.ResolveShared("byd")->run("DMI");
cars.ResolveShared("baoma")->run(".....");
return 0;
}
标签:std,function,createMap,C++,key,简单,include,IocContainer
From: https://www.cnblogs.com/xcodingfork/p/17134747.html