c++ 解决if-else太多的问题
一个项目当中有很多的if-else分支,并且会随时修改
具体问题如下所示:
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<functional>
void PrintPdf(){
std::cout<<"This is pdf\n";
}
void PrintCsv(){
std::cout<<"This is csv\n";
}
int main(int argc,char** argv){
std::vector<std::string> args;
for (int i = 0; i < argc; i++) {
args.push_back(argv[i]);
}
//args[0] 表示当前文件的详细路径,[1]表示输入的第一个参数
std::string s=args[1];
//假设有很多的动态要修改的文档格式要处理,需要频繁的修改if-else
if(s=="pdf"){
PrintPdf();
} else if (s=="csv"){
PrintCsv();
}else{
std::cout<<"Error!\n";
}
return 0;
}
解决办法:Register 设计
一种基础的Register-注册表的设计
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<functional>
void PrintPdf(){
std::cout<<"This is pdf\n";
}
void PrintCsv(){
std::cout<<"This is csv\n";
}
//修改的部分
std::unordered_map<std::string,std::function<void()>>kregister_pattern={
{"pdf",std::bind(PrintPdf)},
{"csv",std::bind(PrintCsv)}
};
int main(int argc,char** argv){
std::vector<std::string> args;
for (int i = 0; i < argc; i++) {
args.push_back(argv[i]); // 自动转换char*到string
}
std::string s=args[1];
//修改的部分
if(kregister_pattern.find(s)!=kregister_pattern.end()){
std::function<void()>print_test=kregister_pattern[s];
print_test();
} else{
std::cout<<"Error !\n";
}
return 0;
}
问题:还是要手动注册添加增删,并且是全局变量
进一步修改
#include"test.h"
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<functional>
void PrintPdf(){
std::cout<<"This is pdf\n";
}
void PrintCsv(){
std::cout<<"This is csv\n";
}
//类似插件的模式
RegisterExporter("pdf",PrintPdf);
RegisterExporter("csv",PrintCsv);
int main(int argc,char** argv){
std::vector<std::string> args;
for (int i = 0; i < argc; i++) {
args.push_back(argv[i]); // 自动转换char*到string
}
std::string s=args[1];
static std::unordered_map<std::string,std::function<void()>>
register_pattern=exporters();
if(register_pattern.find(s)!=register_pattern.end()){
std::function<void()>print_test=register_pattern[s];
print_test();
} else{
std::cout<<"Error !\n";
}
return 0;
}
头文件的内容
#include<functional>
#include<string>
#include<unordered_map>
using ExportFn = std::function<void()>;
//类似类的静态成员变量所有实例共有
//返回引用,修改一处所有的对象全都对应增加或者删除
std::unordered_map<std::string, ExportFn>& exporters(){
static std::unordered_map<std::string,ExportFn> table;
return table;
}
struct ExportRegister {
ExportRegister(const std::string& format, ExportFn fn){
exporters()[format] =std::move(fn);
}
};
//##表示连接 \(c++11之前的编译器要求所有的宏定义内容放在同一行)
//表示每次定义一个 _reg_函数 (变量名唯一) 的变量去注册
#define RegisterExporter(format,fn) \
static ExportRegister _reg_##fn(format,fn) ;
浙公网安备 33010602011771号