如何简化C++模板函数中基于字符串的create调用,减少if-else?
优化C++函数中的if-else语句,避免重复调用create函数
针对你给出的代码,我们可以通过运行时分发映射或者variant+访问器的方式去掉冗余的if-else,同时统一create的调用逻辑,以下是具体实现方案:
方案一:使用函数映射表(推荐,易扩展)
将字符串与对应的处理逻辑绑定到哈希表中,直接通过字符串查找并执行逻辑,彻底消除if-else:
#include <unordered_map> #include <functional> template <typename A, typename B> void doSomething(string str, vector<A> arrA, vector<B> arrB) { // 构建字符串到处理逻辑的映射 const std::unordered_map<std::string, std::function<void()>> handlers = { {"a", [&]() { create<A>(arrA); }}, {"b", [&]() { create<B>(arrB); }} }; // 查找并执行对应逻辑 auto handler_it = handlers.find(str); if (handler_it != handlers.end()) { handler_it->second(); } // 可根据需求添加未知字符串的错误处理 } template<typename X> void create(vector<X> arrX) { // do something with arrX }
这种方式的优势在于后续新增类型时,只需要在映射表中添加新的键值对即可,无需修改条件判断逻辑,符合开闭原则。
方案二:使用std::variant统一处理(C++17及以上)
借助std::variant存储不同类型的vector,再通过std::visit统一调用create,虽然仍需少量判断来赋值variant,但create的调用逻辑完全统一:
#include <variant> template <typename A, typename B> void doSomething(string str, vector<A> arrA, vector<B> arrB) { std::variant<vector<A>, vector<B>> vec_var; // 根据字符串选择对应的vector存入variant if (str == "a") { vec_var = std::move(arrA); } else if (str == "b") { vec_var = std::move(arrB); } else { return; // 处理未知输入 } // 统一调用create,由visit自动推导类型 std::visit([](auto&& vec) { create(std::forward<decltype(vec)>(vec)); }, vec_var); } template<typename X> void create(vector<X> arrX) { // do something with arrX }
额外优化建议
原代码中vector参数采用传值方式会导致不必要的拷贝,建议改为传引用(如果不需要修改原vector则用const引用):
// 修改doSomething的参数为引用 void doSomething(string str, const vector<A>& arrA, const vector<B>& arrB) // 同步修改create的参数 void create(const vector<X>& arrX)
内容的提问来源于stack exchange,提问作者Sahl
相关产品推荐
相关产品推荐

