如何使用带有多个字符串参数的工厂方法来创建模板class?
How to use factory method with multi string parameters to create a template class?
我有一个带有两个字符串参数的工厂函数(每个参数表示一个 class)。我怎样才能减少使用 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_)map
和 std::pair<std::string,std::string>
作为键类型,并使用 lambda 或自由函数作为值类型。
但是,函数不能 return 不同的类型,并且 A<w,x>
是不同于 A<y,z>
的类型。如果你真的想让它工作,你应该从非模板基 class 派生 A
,return 指向该基 class 的指针,然后创建你的 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();
}
我有一个带有两个字符串参数的工厂函数(每个参数表示一个 class)。我怎样才能减少使用 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_)map
和 std::pair<std::string,std::string>
作为键类型,并使用 lambda 或自由函数作为值类型。
但是,函数不能 return 不同的类型,并且 A<w,x>
是不同于 A<y,z>
的类型。如果你真的想让它工作,你应该从非模板基 class 派生 A
,return 指向该基 class 的指针,然后创建你的 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();
}