首页 > 编程语言 >C++类模板实现工厂模式(优化if else/switch case)

C++类模板实现工厂模式(优化if else/switch case)

时间:2023-07-10 16:58:05浏览次数:40  
标签:case std return C++ producers _. switch const id

引自:https://blog.csdn.net/weixin_43795921/article/details/127224633

template <typename IdentifierType, class AbstractProduct,
class ProductCreator = AbstractProduct *(*)(),
class MapContainer = std::map<IdentifierType, ProductCreator>>
class Factory {
public:
bool Register(const IdentifierType &id, ProductCreator creator) {
return producers_.insert(std::make_pair(id, creator)).second;
}

bool Unregister(const IdentifierType &id) {
return producers_.erase(id) == 1;
}
void Clear() { producers_.clear(); }
bool Empty() const { return producers_.empty(); }

template <typename... Args>
std::unique_ptr<AbstractProduct> CreateObjectOrNull(const IdentifierType &id,
Args &&... args) {
auto id_iter = producers_.find(id);
if (id_iter != producers_.end()) {
return std::unique_ptr<AbstractProduct>(
(id_iter->second)(std::forward<Args>(args)...));
}
return nullptr;
}

template <typename... Args>
std::unique_ptr<AbstractProduct> CreateObject(const IdentifierType &id,
Args &&... args) {
auto result = CreateObjectOrNull(id, std::forward<Args>(args)...);
PUB_E_IF(!result, "Factory could not create Object of type : " << id);
return result;
}

private:
MapContainer producers_;
};

Factory<int, IShape> oFactory;

oFactory.Register(1, []()->IShape*{return new CircleShape("color")};

 

标签:case,std,return,C++,producers,_.,switch,const,id
From: https://www.cnblogs.com/kinglxg/p/17541574.html

相关文章

  • Atcoder ARC164B Switching Travel
    称\(c_u\not=c_v\)的边\((u,v)\)为普通边,\(c_u=c_v\)的边\((u,v)\)为特殊边。能发现若满足条件则这个环应该是由一条特殊边和若干条普通便组成的(从特殊边的一个顶点出发一直经过普通边,最后走到特殊边的另一个顶点再走回来)。于是若这个特殊边的两个顶点能只通过普通......
  • C++ 数据抽象
     数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD播......
  • C++题解——格子游戏
    题目链接:一本通TFLSOJ思路:使用并查集给点连接,如果在连接过程中遇到已连接的点二次连接,就输出代码:#include<bits/stdc++.h>usingnamespacestd;structnode{ intx,y;};nodef[205][205];intn,m;nodefind(nodek){ if(f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)retur......
  • vscode + nodesjs import 和 require 使用的两种case
    在环境nodejs+vscode的环境下,使用nodejs作为js的解释器, 在这种环境中直接使用export/import是无法正常工作的。 解决方式有两个:1.npminit-y胜场package.json修改内容增加: "type":"module",{"name":"javascript","version":"1.0.0&qu......
  • c/c++程序编译运行全过程
    一.预处理-gcc-E1.进行头文件的替换(执行预处理指令)2.删除注释3.不会检查语法二.编译-gcc-S1.会检查语法2.将C语言代码翻译成对应平台的汇编语言三.汇编-gcc-c将汇编语言翻译成二进制指令四.链接-gcc-o把用到的标准库的函数实现,系统启动代码一并链接到最后生成的可......
  • 华为工程师(王桂林)带你实战C++
    适合人群:有一定的C语言基础或是想提高C++水平的在职人员或是想要从事C、C++开发的绝大多数人你将学到:本课程我以实战为主,课上全部代码均为边讲边手敲,学会此套课程,可以达到一个C++中高级研发者的水平。课程简介:王桂林老师,曾供职于海尔,华为等世界500强企业。现在专职于C++教......
  • [C/C++] 函数
    疑问1、函数结束后,函数栈释放的内容有哪些?2、通过函数修改形参的值怎么实现?值传递还是引用传递?基本类型、数组、结构体有什么区别?3、如果想通过函数对实参进行malloc,为什么必须用二级指针?函数栈空间在一个函数执行完毕后其所占用的内存空间(除了静态和全局变量)统统会被释放......
  • 《C++》容器--deque
    deque双端数组。可以对头尾进行插入和删除操作#define_CRT_SECURE_NO_WARNINGS1#include<iostream>#include<deque>#include<algorithm>usingnamespacestd;voidprintdeque(constdeque<int>&d){ for(deque<int>::const_iteratorit=d.begi......
  • 【《C++ Primer 第四版》读书笔记】4.2.5-指针和const限定符
    1.指向const对象的指针1.1表现形式constdouble*ptr,constvoid*ptr1.2如何理解无法通过ptr这个指针变量去修改所指向内存区域的值,但是ptr这种指针变量可以重复赋值,指向不同的内存地址注意ptr这个指针变量赋值时,既可以赋值为const类型变量(书中所说的const对象)的地址,也......
  • day2c++学习
    学习day2C++函数分文件编写(VScode2021配置教程)_spiritLHL的博客-CSDN博客55函数-函数的分文件编写_哔哩哔哩_bilibili!运行还是有中文乱码st1:ctrl+shift+p输出createc++projectst2:在include里建新文件swap.h,里面写头文件和函数声明st3:在src里建新文件swap.cpp......