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) ;
posted @ 2026-01-14 19:21  流光最璀璨i  阅读(3)  评论(0)    收藏  举报