如何使用工厂方法与多字符串参数来创建一个模板类?



我有一个工厂函数,它有两个字符串参数(每个参数表示一个类)。我如何减少使用if分支?

A create_A(string type, string order){
if (type=="LLT" && order == "AMD"){
return A<LLT, AMD>();
}
elif(type=="LLT" && order=="COLAMD"){
return A<LLT, COLAMD>();
}
elif(type=="LU" && order=="AMD"){
return A<LU, AMD>();
}
elif(type=="LU", && order="COLAMD"){
return A<LU, COLAMD>();
}
}

我也试过这个。但是我仍然想减少if分支。

std::unique_ptr<Base> create_A(string type, string order){
if (type=="LLT" && order == "AMD"){
return std::make_unique<Derived<LLT, AMD>>();
}
else if(type=="LLT" && order=="COLAMD"){
return std::make_unique<Derived<LLT, COLAMD>>();
}
else if(type=="LU" && order=="AMD"){
return std::make_unique<Derived<LU, AMD>>();
}
else if(type=="LU", && order="COLAMD"){
return std::make_unique<Derived<LU, COLAMD>>();
}
}

减少此代码的一种方法是使用std::(unsorted_)mapstd::pair<std::string,std::string>作为键类型,并使用lambdas或free函数作为值类型。

然而,一个函数不能返回不同的类型,A<w,x>A<y,z>是不同的类型。如果你真的想让它工作,你应该从一个非模板基类中派生A,返回一个指向那个基类的指针,然后动态地创建你的A对象,例如:

using key_type = std::pair<std::string, std::string>;
using func_type = std::unique_ptr<Base> (*)();
#define MAKE_ENTRY(type, order) {{#type, #order}, []() -> std::unique_ptr<Base> { return std::make_unique<Derived<type, order>>(); }
std::unique_ptr<Base> create_A(string type, string order){
static std::unordered_map<key_type, func_type> A_types = {
MAKE_ENTRY(LLT, AMD),
MAKE_ENTRY(LLT, COLAMD),
MAKE_ENTRY(LU,AMD),
MAKE_ENTRY(LU, COLAMD)
}:
auto func = A_types.at(std::make_pair(type, order));
return func();
}

最新更新