C++ 简单IocContainer

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;
}

原文链接: https://www.cnblogs.com/xcodingfork/p/17134747.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 简单IocContainer

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/319020

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月24日 下午3:08
下一篇 2023年2月24日 下午3:08

相关推荐