首页 > 编程语言 >C++ 简单IocContainer

C++ 简单IocContainer

时间:2023-02-19 15:12:15浏览次数:37  
标签:std function createMap C++ key 简单 include 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;
}

标签:std,function,createMap,C++,key,简单,include,IocContainer
From: https://www.cnblogs.com/xcodingfork/p/17134747.html

相关文章

  • 设计模式-简单工厂
    api.h#pragmaonce#include<string>#include<iostream>classAPI{public: virtualvoidrun(std::string)=0;protected: API(){};};classBAPI:publ......
  • 基于clangd配置sublime text4为C++编辑器
    概述涉及以下插件的安装和配置PackageControlTerminusLSPLSP-clangdclang-formatLSP-pylspLSP-json配置sublime安装PackageControl以进行包管理。Terminus安......
  • C++和C中的输入输出总结、标准输入/标准输出/标准错误与重定向
    标准输入/标准输出/标准错误与重定向0表示标准输入。1表示标准输出。2标准错误。1和2都是默认是输出到屏幕。linux中的>>、>、<、<<:这些符号是Linux中用于重定向输入和输......
  • tsup 简单快速的typescript库打包工具
    tsup是一个很不错的工具,可以方便的进行typescript应用打包以及构建,支持了灵活的资源加载处理tsx也是一个不错的工具,可以进行dev模式的处理tsup参考配置tsup.confi......
  • TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型
    前言 今天这里主要介绍使用Python部署TensorRT的模型以及使用C++部署TensorRT的模型这两种方法。其实在日常部署的工作中,更多是使用C++进行部署,因为这样可以更加丝滑地迁......
  • 软件测试|超好用超简单的Python GUI库——tkinter
    前言如果我们想要使用Python创建一个GUI界面,我们应该使用哪个库?Python有没有实现这个功能的库?答案是肯定的,Python的库这么多,肯定有实现上述功能的库,那么我们应该使用哪一......
  • C++20学习-2 msys2安装
    可以直接从官网下载,但需要配置加速域名,麻烦,可以直接在清华网站上下载。下载站:https://mirrors.tuna.tsinghua.edu.cn/右键配置:msys2配置如何添加右键打开,软件包管理......
  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • c++学习9 结构体
    一结构体赋值结构体赋值的方法有三种,逐个成员赋值,整体赋值和拷贝赋值。设一个结构体有struckstudent{intage;charch[32];};逐个成员赋值:studenttony={16,"tony"};......
  • C++栈上创建对象和堆上创建对象
    一、在栈(Stack)上创建对象Student是一个类,创建一个实例化对象:Studentstu;下面进行创建对象指针的操作(非必须):上面代码中创建的对象stu在栈上分配内存,需要使用&获取......